日期:2014-05-18  浏览次数:20958 次

关于SQL存储过程中的事务处理.
我现在想创建一个存储过程,同时向两个表中新增数据,我的要求是:
1.这两个新增操作只能全部完成或全部失败,
2.当第一个新增操作失败,则弹出错误提示,并中止继续操作.
3.如果第一个新增操作成功,而第二个新增操作失败,则弹出错误信息,并取消第一个新增的操作.

------解决方案--------------------
失败就rollback 两个都成功的情况下结束事物
------解决方案--------------------
事务
------解决方案--------------------
create or replace procedure aa (o_msg out varchar2)is

exp_tb1 EXCEPTION;
exp_tb2 EXCEPTION;
err_msg varchar2(100);
begin
begin

err_msg:= 'insert table1 failed! ';
insert into table1 ...;

err_msg:= 'insert table2 failed! ';

insert into table2 ...;

err_msg:= 'insert OK! ';

commit;
EXCEPTION
WHEN OTHERS THEN
rollback;
o_msg := err_msg || '( ' ||SQLERRM|| ') ';
--dbms_output.put_line(v_step||v_msg);
end;
end aa;
------解决方案--------------------
刚才那两个异常变量没有用到:
create or replace procedure aa (o_msg out varchar2)is

err_msg varchar2(100);
begin
begin

err_msg:= 'insert table1 failed! ';
insert into table1 ...;

err_msg:= 'insert table2 failed! ';

insert into table2 ...;

err_msg:= 'insert OK! ';

commit;
EXCEPTION
WHEN OTHERS THEN
rollback;
o_msg := err_msg || '( ' ||SQLERRM|| ') ';
dbms_output.put_line(o_msg);
end;
end aa;