/*
我们应该知道,当一个PL/SQL块中出现异常时,Oracle数据库不会回滚这个块中的DML语句的修改。
这时候我们需要手动rollback
在写代码的时候,我们不会在被调用的过程写commit。因为一般环境下,外部发生异常,我们都希望进行回滚数据。
假如被调用的过程写了commit,内部的DML就不会回滚,而且还影响到外部的DML。
*/
--1.创建表
create table tb_error
(
id number,
error_msg varchar2(20)
);
--2.创建过程
create or replace procedure auto_transaction is
--pragma autonomous_transaction;
begin
insert into tb_error values (2,'test error!');
commit;
end;
--3.调用过程
declare
a number;
begin
insert into tb_error values(1,'test');
auto_transaction;
a := 'a';
dbms_output.put_line(a);
exception
when others then
rollback;--希望把 insert into tb_error values(1,'test')回滚。而auto_transaction的DML保存。
end;
/*
这时,我们运行代码3的时候,发现tb_error存在insert into tb_error values(1,'test')这条记录。当然id为2的也插进来了
这并不是我的目的。
因为auto_transaction影响了外部的事物。所以为了把他独立开来,我们必须使用自治事物。
把代码2的pragma autonomous_transaction注释去掉重新编译,再运行代码3。我们发现实现了目的。
tb_error只有id为2的记录。
*/
PLSQL总结——16.自治事务
最新推荐文章于 2022-07-26 11:33:45 发布