我想用 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: 可以看到触发器类型和类型之间的关系 25001. 00000 - “无法在 View 上创建此触发器类型” *原因: View 上只能创建 INSTEAD OF 触发器。 *操作:将触发器类型更改为 INSTEAD OF。
预先感谢您的帮助。
最佳答案
你就快到了。这只是语法上的困惑。您无法创建在插入、更新或删除 View 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;
/
关于sql - 在 PL/SQL 中的 View 上触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62325753/