我正在尝试创建一个触发器,在更新表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;期待以下之一:=。 (@%;
我已经测试了每个条件,以确保每个语句单独工作,但它似乎不能一起工作。
答案 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
要么必须是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
...