【问题标题】:Trigger on Views in PL/SQL在 PL/SQL 中触发视图
【发布时间】:2020-10-01 04:15:48
【问题描述】:

我想在 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 den här triggertypen i den här typen av vy 25001. 00000 - “无法在视图上创建此触发器类型” *原因:只能在视图上创建 INSTEAD OF 触发器。 *操作:将触发器类型更改为 INSTEAD OF。

提前感谢您的帮助。

【问题讨论】:

  • 错误很明显:您只能在视图上定义 INSTEAD OF 触发器。 AFTER INSERT OR UPDATE OR DELETE 触发器只能在表上创建(参见文档docs.oracle.com/cd/B28359_01/appdev.111/b28370/triggers.htm
  • 因为错误消息清楚地指出您不能在视图上使用标准触发器。您必须使用 INSTEAD OF 触发器。见Documentation。此外,您不需要选择,而是使用 :new.x、:new.y、:new.z。因为您的选择将尝试检索视图中的每一行。这将导致“Too Many Rows 异常”。

标签: sql oracle plsql view triggers


【解决方案1】:

你快到了。这只是一个语法混乱。您无法创建触发 BEFOREAFTER 插入或更新或删除视图的触发器,但您可以创建触发 INSTEAD OF 插入或更新或删除的触发器:

插入或更新或删除之前/之后的表 查看而不是插入或更新或删除

而且,正如@Belayer 所写,您不(也不应该)使用 SELECT,在插入或更新期间使用名为 :new 的自动准备记录作为新值,或者使用记录“:旧”作为更新或删除期间的旧值。

您的触发器看起来像:

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;
/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    相关资源
    最近更新 更多