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 DATE
s 产生一个数字,表示它们在 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;
/
但基本上:您要确保 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)
);
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
这是大学的一个项目,我需要一些帮助:( 有什么问题吗??
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
DATE
s 产生一个数字,表示它们在 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;
/
但基本上:您要确保 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)
);
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