错误: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 > 120);
(注意括号是多余的,正如威廉·罗伯逊所评论的那样)
raise_application_error()
需要两个参数:一个错误号(在-20999
和-20000
之间)和一个消息
substating DATE
s 产生一个数字,表示它们在天中的差异;事实上,您的代码可确保差异小于 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;
/
但基本上:您要确保HoraFin
和HoraInicio
之间的差异不大于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 > 2/24)
可以更简单地写成IF minutos > 2/24
。以上是关于错误:PLS-00103:遇到符号“;”当期望以下之一时:* & = - + < / > at in is mod remaining not rem then的主要内容,如果未能解决你的问题,请参考以下文章
错误:PLS-00103:在预期以下情况之一时遇到符号“)”
为啥我会收到此错误? PLS-00103:在预期以下情况之一时遇到符号“CREATE”: