我想在PL / SQL中编写触发器。我的第一个目标是比较两个time_stamp数据类型(A和B)。如果其中一个大于另一个,例如A> B,我将更新另一个表上的列。我尝试写的触发器如下。
CREATE OR REPLACE TRIGGER trigger_name
AFTER INSERT OR UPDATE OR DELETE ON views
FOR EACH ROW
DECLARE
A views.X%TYPE;
B views.Y%TYPE;
C views.Z%TYPE;
BEGIN
SELECT X, Y, Z INTO A, B, C FROM views;
IF A>B THEN
update another_table set D=' ' and E='UNRESOLVED' where column1=A;
ELSE
dbms_output.put_line('ABC: ' || A || ' < ' || 'CDE' || B);
END IF;
END;
如果执行此触发器,将出现如下错误。
错误报告:ORA-25001:kan inte skapa denhärtriggertypen i denhärtypen av vy25001。00000-“无法在视图上创建此触发器类型”*原因:只能在视图上创建INSTEAD OF触发器。*操作:将触发器类型更改为INSTEAD OF。
谢谢您的帮助。
您快到了。这只是语法上的混乱。您不能创建触发BEFORE
或AFTER
插入,更新或删除视图的触发器,但可以创建触发INSTEAD OF
插入,更新或删除的触发器:
在插入,更新或删除之前/之后的表 查看插入或更新或删除的说明
而且,正如@Belayer所写的那样,您不(也不应该)使用SELECT,在插入或更新期间将自动准备好的记录称为:new
作为新值,或者将记录':old'用于旧记录。值在更新或删除期间。
您的触发器将类似于:
CREATE OR REPLACE TRIGGER views_tr
INSTEAD OF INSERT OR UPDATE OR DELETE ON views
FOR EACH ROW
BEGIN
IF :new.x > :new.y THEN
UPDATE another_table SET D=' ', ... WHERE column1 = :new.x;
ELSE
dbms_output.put_line('ABC: ' || :new.x || ' < ' || 'CDE' || :new.y);
END IF;
END views_tr;
/