【发布时间】:2021-09-03 02:02:19
【问题描述】:
我写了一个触发器,它在最后调用一个过程,过程有一个提交语句。 当我执行触发器时,它给了我错误“无法在触发器中提交”。 然后我声明了 PRAGAMA AUTONOMUS_TRANSACTION 但这也给出了错误“检测到并回滚了主动自治事务”,“触发器执行期间出错”
CREATE OR REPLACE TRIGGER Test_Ord_Update
AFTER
insert or update on test1
for each row
declare
PRAGMA AUTONOMOUS_TRANSACTION;
l_exst number(1);
v_id NUMBER (5);
begin
merge into test2 b
USING dual a
on (:new.id = b.id)
when matched then update set
b.price1 = :new.price1,
b.price2 = :new.price2
when not matched then insert (id, price1, price2)
values (:new.id, :new.price1, :new.price2);
select id into v_id from test2 where price1 = :new.price1;
LOAD_PRICE(v_id);
end;
【问题讨论】:
-
您永远不会在触发器中提交或回滚。执行工作的会话需要执行提交或回滚
-
自治事务在新的会话中执行,到最后(执行回到当前会话时)还没有完成(提交或回滚)。这就是甲骨文所说的。查看9i docs了解更多详情
-
你应该检查自治事务的概念。它具有孤立的上下文,因此它对主程序一无所知。要么在自治事务中提交,要么根本不使用它
-
使用自治事务处理日志以外的事情几乎可以肯定是一个错误。例如,您是否意识到执行
insert的会话现在可以回滚他们的事务并且您的触发器和存储过程所做的更改不会被回滚?因此表中的数据将不同步。或者如果load_price过程查询test1它将看到以前的值而不是导致触发器触发的更改值?