【问题标题】:Multiple conditionals inside a trigger using SQL使用 SQL 的触发器内的多个条件
【发布时间】:2018-08-28 08:04:12
【问题描述】:

我正在尝试创建一个触发器,该触发器将在更新表 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:在预期以下情况之一时遇到符号“”::=。 (@%;

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

【问题讨论】:

    标签: sql oracle triggers conditional


    【解决方案1】:

    除了ELSEIFneeding to be ELSIF正如@Gordon指出的那样,那些ELSIF条件还需要THEN

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

    您的最终ELSE 必须是ELSIF 加上THEN

    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
           ...
    

    【讨论】:

      【解决方案2】:

      Oracle 对多个条件使用ELSIF,而不是ELSEIF

      这可能是错误的原因。

      【讨论】:

        猜你喜欢
        • 2019-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-23
        • 2011-01-31
        • 1970-01-01
        • 2021-12-16
        • 2012-12-11
        相关资源
        最近更新 更多