PL / SQL ORACLE:months_between的触发器没有做任何事情

时间:2017-11-27 06:39:59

标签: sql oracle plsql database-trigger

所以我有两张桌子,人和预订。当一个人试图进行预订但是他想要注册的那天和预订开放的那天之间的差异大于2个月时,那么屏幕上应该显示一个错误,表示你为此预留了太久。这是我做的触发器:(注意:预留表中的PEOPLEID充当外键)

create or replace trigger reservings 
    before insert OR UPDATE on RESERVATION
    for each row
declare
vdate   DATE;   
vadd  number;
begin
select date_to_register into vdate from PEOPLE WHERE PEOPLEID=:NEW.PEOPLEID;
    vadd:=TRUNC(MONTHS_BETWEEN(vdate,:NEW.RESERVATIONDATE));
    if INSERTING AND vadd>2 then 
      Raise_Application_Error (-20343, 'ITS TOO EARLY');
      ELSIF UPDATING AND vadd>2 then
      Raise_Application_Error (-20343, 'ITS TOO EARLY');
    end if;
    end;

因此,当我运行此命令时,触发器会被编译,但是当我输入一个人可能想要进行预订的日期以及预订日期实际上是并且显然存在超过2个月的差异时,它仍然允许输入数据而不是抛出错误。发生了什么? :/ 继承人我在预订表上插入的内容:

INSERT INTO RESERVATION(ID,PEOPLEID,RESERVATIONDATE) VALUES(1,1,(TO_DATE('11/12/2018', 'DD/MM/YYYY')));

1 个答案:

答案 0 :(得分:1)

问题是如果第二个参数大于第一个参数,MONTHS_BETWEEN将返回负值。

如果您始终确定MONTHS_BETWEEN(:NEW.RESERVATIONDATE , vdate)

,则需要使用vdate < :NEW.RESERVATIONDATE

否则,如果您只对2个月的差异感兴趣,请在表达式上使用ABS()函数。

类似于...ABS(vadd) > 2 ..