ERROR : PLS-00103: Encountered the symbol ";" when expecting one of the following: * & = - + < / > at in is mod remainder not rem then

ERROR : PLS-00103: Encountered the symbol ";" when expecting one of the following: * & = - + < / > at in is mod remainder not rem then

这是大学的一个项目,我需要一些帮助:( 有什么问题吗??

CREATE TABLE RESERVAS(
    OID_RE NUMBER NOT NULL,
    PrecioReserva INTEGER NOT NULL,
    fecha DATE NOT NULL,
    HoraInicio DATE NOT NULL,
    HoraFin DATE NOT NULL,
    OID_ESC NUMBER,
    OID_SOC NUMBER,
    OID_PIS NUMBER NOT NULL
);

CREATE OR REPLACE TRIGGER HorarioReseva
BEFORE INSERT OR UPDATE ON RESERVAS
FOR EACH ROW
DECLARE
    minutos NUMBER;
BEGIN 
    minutos := :NEW.HoraFin - :NEW.HoraInicio;
    IF(minutos > 120);
        THEN  raise_application_error
        ('No se puede reservar una pista durante más de 2h(120min)');
     END IF;
END;

您的代码有问题:

  • 这个表达式的末尾有一个分号,不应该有分号IF(minutos > 120);(注意括号是多余的,正如William Robertson评论的那样)

  • raise_application_error() 需要两个参数:一个错误号(在 -20999-20000 之间)和一条消息

  • substrating DATEs 产生一个数字,表示它们在 days 中的差异;事实上,您的代码确保差异小于 120 天,就您而言,这不是您想要的。

这是您的代码的正确版本:

CREATE OR REPLACE TRIGGER HorarioReseva
BEFORE INSERT OR UPDATE ON RESERVAS
FOR EACH ROW
DECLARE
    minutos NUMBER;
BEGIN 
    minutos := :NEW.HoraFin - :NEW.HoraInicio;
    IF minutos > 2/24
        THEN  raise_application_error(
            -20000,
            'No se puede reservar una pista durante más de 2h(120min)'
        );
     END IF;
END;
/

但基本上:您要确保 HoraFinHoraInicio 之间的时差不超过 2 小时。您不需要触发器:CHECK 约束就足够了。

CREATE TABLE RESERVAS (
    OID_RE NUMBER NOT NULL,
    PrecioReserva INTEGER NOT NULL,
    fecha DATE NOT NULL,
    HoraInicio DATE NOT NULL,
    HoraFin DATE NOT NULL,
    OID_ESC NUMBER,
    OID_SOC NUMBER,
    OID_PIS NUMBER NOT NULL,
    CHECK(HoraFin - HoraInicio <= 2/24)
);

Demo on DB Fiddle:

insert into reservas (OID_RE, PrecioReserva, fecha, HoraInicio, HoraFin, OID_PIS)
values(
    1, 
    2, 
    to_date('2019-01-01', 'yyyy-mm-dd'), 
    to_date('2019-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss'), 
    to_date('2019-01-01 02:00:00', 'yyyy-mm-dd hh24:mi:ss'),
    1
);
--> 1 rows affected

insert into reservas (OID_RE, PrecioReserva, fecha, HoraInicio, HoraFin, OID_PIS)
values(
    1, 
    2, 
    to_date('2019-01-01', 'yyyy-mm-dd'), 
    to_date('2019-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss'), 
    to_date('2019-01-01 02:01:00', 'yyyy-mm-dd hh24:mi:ss'),
    1
);
--> ORA-02290: check constraint (FIDDLE_LTVQMOQEMVHALMINECEI.SYS_C00308788) violated