使用SQL在触发器内部的多个条件

时间:2018-03-19 16:57:32

标签: sql oracle triggers conditional

我正在尝试创建一个触发器,在更新表DETAILRENTAL后更新名为VIDEO的表。我试图使用IF ELSE条件来满足多种情况。

这就是我编码的内容:

CREATE OR REPLACE TRIGGER TRG_VIDEORENTAL_UP
AFTER UPDATE OF DETAIL_RETURNDATE ON DETAILRENTAL
FOR EACH ROW
BEGIN  
 IF :NEW.DETAIL_RETURNDATE IS NULL THEN
       UPDATE VIDEO
       SET VID_STATUS = 'OUT'
       WHERE :NEW.VID_NUM = VID_NUM;

ELSEIF
  :NEW.DETAIL_RETURNDATE > SYSDATE
       UPDATE VIDEO
       SET VID_STATUS = 'OUT'
       WHERE:NEW.VID_NUM = VID_NUM;

ELSEIF
  :NEW.DETAIL_RETURNDATE < SYSDATE OR :NEW.DETAIL_RETURNDATE = SYSDATE 
       UPDATE VIDEO
       SET VID_STATUS = 'IN'
       WHERE :NEW.VID_NUM = VID_NUM;

ELSE 
   :NEW.DETAIL_RETURNDATE = '01/01/01'
       UPDATE VIDEO
       SET VID_STATUS = 'LOST'
       WHERE :NEW.VID_NUM = VID_NUM ;

  END IF;
end;

这是我运行此代码时收到的错误消息:

  

第8行出错:PLS-00103:遇到符号&#34;&#34;期待以下之一:=。 (@%;

我已经测试了每个条件,以确保每个语句单独工作,但它似乎不能一起工作。

2 个答案:

答案 0 :(得分:1)

Oracle使用ELSIF,而不是ELSEIF用于多种情况。

这可能是错误的原因。

答案 1 :(得分:0)

除了@Gordon指出的ELSEIF needing to be ELSIF之外,那些ELSIF条件仍然需要THEN

ELSIF
  :NEW.DETAIL_RETURNDATE > SYSDATE THEN
       UPDATE VIDEO
       ...
ELSIF
  :NEW.DETAIL_RETURNDATE < SYSDATE OR :NEW.DETAIL_RETURNDATE = SYSDATE THEN
       UPDATE VIDEO
       ...

并且您的最终ELSE要么必须是ELSIFTHEN

ELSIF 
   :NEW.DETAIL_RETURNDATE = '01/01/01' THEN
       UPDATE VIDEO
       ...

或删除该条件:

ELSE
       UPDATE VIDEO
       ...

取决于您实际需要的逻辑。

如果您确实需要条件,因此需要ELSIF,那么您在比较该条件中的日期的方式也是错误的; '01/01/01'是一个字符串而不是日期,因此您依靠使用会话的NLS设置进行隐式转换,您可能无法控制。使用带有合适格式掩码的to_date()an ANSI date literal

ELSIF 
   :NEW.DETAIL_RETURNDATE = DATE '2001-01-01' THEN
       UPDATE VIDEO
       ...