Oracle 触发器给出错误 - 检测到并回滚活动的自治事务
Oracle trigger is giving error - active autonomous transaction detected and rolled back
我写了一个触发器,它在最后调用一个过程,过程有一个提交语句。
当我执行触发器时,它给我错误“无法在触发器中提交”。
然后我声明了 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;
每当我们在有提交语句的触发器中调用子程序时,我们必须需要在我们调用子程序的行之后写一个提交。如下图
创建或替换触发器Test_Ord_Update
之后
在 test1
上插入或更新
每行
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);
COMMIT;
end;
我写了一个触发器,它在最后调用一个过程,过程有一个提交语句。 当我执行触发器时,它给我错误“无法在触发器中提交”。 然后我声明了 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;
每当我们在有提交语句的触发器中调用子程序时,我们必须需要在我们调用子程序的行之后写一个提交。如下图
创建或替换触发器Test_Ord_Update
之后
在 test1
上插入或更新
每行
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);
COMMIT;
end;