如果我尝试从表中删除并且表上的日期等于sysdate
,则必须创建引发错误的触发器。
这是我的代码:
create or replace trigger nonViolation
before insert or delete on reservation
for each row
declare
error exception;
error2 exception;
dateres date:=sysdate;
begin
if inserting then
if :new.dateDep<dateres then
raise error;
end if;
end if;
if deleting then
if (:OLD.datedep=dateres)
then
raise error2;
end if;
end if;
exception
when error2 then
raise_application_error(-20003,'supression impossible');
when error then
raise_application_error(-20001,'reservation impossible');
end;
我试图删除包含今天的date 25-nov-18
的行,并且该触发器不起作用。我尝试打印:old.datedep
和dateres
的值,它们是相同的:
25-nov-2018
25-nov-2018
有人可以帮助我吗?谢谢
答案 0 :(得分:2)
我怀疑您不允许SYSDATE包含当前时间和当前日期。如果您删除以下时间元素,则触发器可能会产生预期的结果:
...
error2 exception;
dateres date := trunc(sysdate);
begin
...
“它不起作用,”
如@bobjarvis所建议,您可能需要从datedep
中剥离时间元素(取决于您如何填充):
if TRUNC(:OLD.datedep) = dateres
尝试使用完整的日期格式掩码,例如'yyyy-mm-dd hh24:mi:ss'
,然后查看实际的内容。
答案 1 :(得分:0)
在Oracle列上,日期类型为DATE的变量具有日期成分(年-月-日)加上时间成分(24小时制中的小时,分钟,秒)。
在屏幕上如何“查看”取决于开发工具和工具的本地配置。
如果时间部分是午夜(00:00:00),则某些工具不会显示时间部分。
此外,您所在的国家/地区也会影响工具显示日期的方式。
没有第二个参数的DATE类型的值上的TRUNC函数给出的DATE类型的值的组件时间为午夜(00:00:00)。
因此要比较当天使用的2个值:
Trunc(:old.datedep)=trunc(dateres)