我想在表上使用触发器,每次插入,更新或删除行时都会触发该触发器.
我写了这样的东西:
CREATE or REPLACE TRIGGER test001
AFTER INSERT OR DELETE OR UPDATE ON tabletest001
REFERENCING OLD AS old_buffer NEW AS new_buffer
FOR EACH ROW WHEN (new_buffer.field1 = 'HBP00')
Run Code Online (Sandbox Code Playgroud)
它的工作原理.因为如果插入,更新或删除行,我想做同样的事情,我想知道触发器中发生了什么.我想我可以设法找到是否插入或更新了行(我可以使用new_buffer检查old_buffer).如何知道该行是否已被删除?
dev*_*vio 38
来自使用触发器:
检测触发触发器的DML操作
如果多种类型的DML操作可以触发触发器(例如,ON INSERT OR DELETE OR UPDATE OF Emp_tab),则触发器主体可以使用条件谓词INSERTING,DELETING和UPDATING来检查触发器的哪种类型的语句.
所以
IF DELETING THEN ... END IF;
Run Code Online (Sandbox Code Playgroud)
应该适合你的情况.
Lef*_*tyX 24
我已经改变了我的代码,它可以工作:
CREATE or REPLACE TRIGGER test001
AFTER INSERT OR UPDATE OR DELETE ON tabletest001
REFERENCING OLD AS old_buffer NEW AS new_buffer
FOR EACH ROW WHEN (new_buffer.field1 = 'HBP00' OR old_buffer.field1 = 'HBP00')
DECLARE
Operation NUMBER;
CustomerCode CHAR(10 BYTE);
BEGIN
IF DELETING THEN
Operation := 3;
CustomerCode := :old_buffer.field1;
END IF;
IF INSERTING THEN
Operation := 1;
CustomerCode := :new_buffer.field1;
END IF;
IF UPDATING THEN
Operation := 2;
CustomerCode := :new_buffer.field1;
END IF;
// DO SOMETHING ...
EXCEPTION
WHEN OTHERS THEN ErrorCode := SQLCODE;
END;
Run Code Online (Sandbox Code Playgroud)
NEW值(或您已重命名为NEW_BUFFER)仅在插入和更新时可用。要删除,您需要使用OLD(OLD_BUFFER)。因此,您的触发器将变为:
CREATE or REPLACE TRIGGER test001
AFTER INSERT OR DELETE OR UPDATE ON tabletest001
REFERENCING OLD AS old_buffer NEW AS new_buffer
FOR EACH ROW WHEN (new_buffer.field1 = 'HBP00' OR old_buffer.field1 = 'HBP00')
Run Code Online (Sandbox Code Playgroud)
您可能需要在触发器内添加逻辑,以适应将field1从“ HBP000”更新为其他代码的代码。
| 归档时间: |
|
| 查看次数: |
127308 次 |
| 最近记录: |