PL / SQL中的视图触发

问题描述 投票:2回答:1

我想在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。

谢谢您的帮助。

sql oracle plsql view triggers
1个回答
0
投票

您快到了。这只是语法上的混乱。您不能创建触发BEFOREAFTER插入,更新或删除视图的触发器,但可以创建触发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;
/
© www.soinside.com 2019 - 2024. All rights reserved.