【问题标题】:Sql Oracle 12c TriggerSql Oracle 12c 触发器
【发布时间】:2018-04-04 04:37:27
【问题描述】:

我需要一些帮助。 我正在尝试创建一个触发器,该触发器在对特定表执行插入、删除或更新操作时执行一个过程。 这是触发器

CREATE OR REPLACE NONEDITIONABLE TRIGGER NQDI.GAV_TRG 
AFTER INSERT or UPDATE or DELETE ON D_GAV
FOR EACH ROW
BEGIN
    PRC_FILL_D_GAV(:old.report_name);
END;

不幸的是,由于触发器在任何提交完成之前启动并且我需要从同一个表中读取,它给了我“D_GAV 表正在修改无法读取”错误。 此外, FOR EACH ROW 使触发器在每条记录发生变化时开始,而我希望触发器只在最后开始,当每次更新、插入或删除都已提交时,但我没有在执行此操作时找到一种方法来保留 :old.report_name。 我知道我可以通过“启动并运行的过程”来做我想做的事,但我想避免这种情况。还有其他我忽略的解决方案吗?

【问题讨论】:

  • 只需删除FOR EACH ROW 子句,然后每条语句触发一次,而不是每条记录触发一次。但是,在这种情况下,您无法访问 :old.report_name
  • 是的,我想过,但它给了我错误“表级触发器中不允许新或旧引用”,而我绝对需要那个变量
  • 您不能将触发器与事务分开,即 COMMIT。将所有内容放在一个过程中,并在那里执行您需要的所有操作。
  • 你到底想在PRC_FILL_D_GAV(:old.report_name)做什么?
  • @Wernfried Domscheit 我明白,但不能这样做。还有其他进程可以更改该表(不在我的控制之下),因此我需要触发器来执行该过程。否则,我必须不断检查它是否已更改。 @ Kaushik Nayak 该过程会修改与 D_GAV 相关的表上的一些记录,但有些字段是从 D_GAV 本身读取的。

标签: sql oracle triggers oracle12c


【解决方案1】:

您需要一个复合触发器。在每个行事件之后,您将数据插入到数组中。在语句之后,您遍历数据并调用您的过程。

create or replace trigger nqdi.gav_trg
for insert or update or delete on d_gav compound trigger

  type type_table_of_gav is table of d_gav%rowtype;
  v_gavs type_table_of_gav := type_table_of_gav();

  after each row is
  begin
    v_gavs.extend(1);
    v_gavs(v_gavs.count).report_name := coalesce(:old.report_name, :new.report_name);
  end after each row;

  after statement is
  begin
    for i in 1 .. v_gavs.count loop
      prc_fill_d_gav(v_gavs(i).report_name);
    end loop;
  end after statement;

end gav_trg;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 2019-07-28
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    相关资源
    最近更新 更多