【发布时间】:2021-01-07 12:28:50
【问题描述】:
一开始我认为这是很容易执行的事情,但是我被使用触发器的变异错误困住了,我不知道如何执行它 此操作的主要目标是避免更新行被执行两次......所以一旦某些字段被更新,我需要一个将行移动到另一个表的过程(该表中的相同字段)
我已尝试使用 AFTER update 触发.. 但出现变异错误
希望有人能帮助我
提前谢谢你
拉夫
【问题讨论】:
一开始我认为这是很容易执行的事情,但是我被使用触发器的变异错误困住了,我不知道如何执行它 此操作的主要目标是避免更新行被执行两次......所以一旦某些字段被更新,我需要一个将行移动到另一个表的过程(该表中的相同字段)
我已尝试使用 AFTER update 触发.. 但出现变异错误
希望有人能帮助我
提前谢谢你
拉夫
【问题讨论】:
看不到的代码很难调试;你为什么不发布一个测试用例让我们看看你做了什么以及 Oracle 是如何回应的?
因为,它按预期工作 - 如果我正确理解了这个问题。方法如下。
SQL> create table test (id number, name varchar2(20));
Table created.
SQL> create table test_2 (id number, name varchar2(20), datum date);
Table created.
SQL> create or replace trigger trg_ai_test
2 after insert on test
3 for each row
4 begin
5 insert into test_2 (id, name, datum)
6 values (:new.id, :new.name, sysdate);
7 end;
8 /
Trigger created.
测试:
SQL> insert into test (id, name) values (1, 'Littlefoot');
1 row created.
SQL> select * from test;
ID NAME
---------- --------------------
1 Littlefoot
SQL> select * From test_2;
ID NAME DATUM
---------- -------------------- -------------------
1 Littlefoot 07.01.2021 13:47:31
SQL>
我假设您的触发器是从您创建触发器的表中选择的(在我的示例中,这将是select ... from test)。由于变异表错误,您不能这样做,但是 - 您也不必这样做,因为您可以使用 :new 和/或 :old 列的值。
【讨论】:
正是这样!变异
我已经找到了让它工作的方法:
创建或替换 TRIGGER TRIGGER1 在 SCAN4000 上更新自动计数后
开始 插入 SCAN4000_SAP (datamatrixcode, automaticcount) 从 scan4000 中选择 scan4000.datamatrixcode, scan4000.automaticcount 其中自动计数不为空; 从 scan4000.automaticcount 不为空的 SCAN4000 中删除; 结束;
一位同事刚刚告诉我,这可能会导致死锁,您怎么看?
【讨论】: