pl/sql中视图的触发器

cx6n0qe3  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(413)

我想用pl/sql编写一个触发器。我的第一个目的是比较两种时间戳数据类型(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 den hä触发器类型är类型av vy 25001。00000-“无法在视图上创建此触发器类型”原因:只能在视图上创建instead of触发器操作:将触发器类型更改为而不是。
事先谢谢你的帮助。

pes8fvy9

pes8fvy91#

你就快到了。这只是句法上的混乱。不能创建触发的触发器 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;
/

相关问题