使用SQL在触发器中使用多个条件
我试图创建一个触发器,在更新表detailrent之后更新一个名为VIDEO的表。我试图使用IF-ELSE条件来满足多种情况 这就是我的代码:使用SQL在触发器中使用多个条件,sql,oracle,triggers,conditional,Sql,Oracle,Triggers,Conditional,我试图创建一个触发器,在更新表detailrent之后更新一个名为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
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;
创建或替换触发器TRG\u VIDEORENTAL\u UP
更新详细信息后,返回详细信息租赁的日期
每行
开始
如果:NEW.DETAIL_RETURNDATE为空,则
更新视频
设置VID_状态='OUT'
其中:NEW.VID_NUM=VID_NUM;
埃尔塞夫
:NEW.DETAIL\u RETURNDATE>SYSDATE
更新视频
设置VID_状态='OUT'
其中:NEW.VID_NUM=VID_NUM;
埃尔塞夫
:NEW.DETAIL\u RETURNDATE
这是我运行此代码时收到的错误消息:
第8行错误:PLS-00103:在预期以下情况之一时遇到符号“”:=。(@%
我已经测试了每个条件,以确保每个语句单独工作,但它似乎不能一起工作。Oracle对多个条件使用
ELSIF
,而不是ELSEIF
这可能是错误的原因。除了@Gordon指出的
ELSEIF
之外,那些ELSEIF
条件仍然需要THEN
:
ELSIF
:NEW.DETAIL_RETURNDATE > SYSDATE THEN
UPDATE VIDEO
...
ELSIF
:NEW.DETAIL_RETURNDATE < SYSDATE OR :NEW.DETAIL_RETURNDATE = SYSDATE THEN
UPDATE VIDEO
...
ELSIF
:NEW.DETAIL_RETURNDATE = '01/01/01' THEN
UPDATE VIDEO
...
或删除该条件:
ELSE
UPDATE VIDEO
...
取决于您实际需要的逻辑
如果确实需要该条件,因此需要使用ELSIF
,那么在该条件下比较日期的方式也是错误的;'01/01/01'
是字符串而不是日期,因此您依赖于使用会话的NLS设置的隐式转换,而您可能无法控制该设置。使用to_date()
具有合适的格式掩码,或:
ELSIF
:NEW.DETAIL_RETURNDATE = DATE '2001-01-01' THEN
UPDATE VIDEO
...