错误:PLS-00103:遇到符号“;”当期望以下之一时:* & = - + < / > at in is mod remaining not rem then

Posted

技术标签:

【中文标题】错误:PLS-00103:遇到符号“;”当期望以下之一时:* & = - + < / > at in is mod remaining not rem then【英文标题】:ERROR : PLS-00103: Encountered the symbol ";" when expecting one of the following: * & = - + < / > at in is mod remainder not rem then 【发布时间】:2020-01-10 12:20:49 【问题描述】:

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

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;

【问题讨论】:

【参考方案1】:

您的代码有问题:

这个表达式的末尾有一个分号,它不应该在那里IF(minutos &gt; 120);(注意括号是多余的,正如威廉·罗伯逊所评论的那样)

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

substating DATEs 产生一个数字,表示它们在中的差异;事实上,您的代码可确保差异小于 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

【讨论】:

IF(minutos &gt; 2/24)可以更简单地写成IF minutos &gt; 2/24

以上是关于错误:PLS-00103:遇到符号“;”当期望以下之一时:* & = - + < / > at in is mod remaining not rem then的主要内容,如果未能解决你的问题,请参考以下文章

PLS-00103:遇到符号“;”当期待以下之一时:

错误:PLS-00103:在预期以下情况之一时遇到符号“)”

PLS-00103:预期时遇到符号“(”

为啥我会收到此错误? PLS-00103:在预期以下情况之一时遇到符号“CREATE”:

错误:PLS-00103:在预期以下情况之一时遇到符号“END”

错误(30,11):PLS-00103:遇到符号更新错误