oracle 存储过程设置回滚点,(转)oracle 存储过程事宜使用断点回滚 -savepoint
學(xué)習(xí)存儲過程中使用斷點(diǎn)回滾事務(wù)時,發(fā)現(xiàn)目前網(wǎng)絡(luò)上存在一個問題,那就是使用斷點(diǎn)回滾后,都忘記了一個很重要的事情,提交事務(wù)。雖然使用了斷點(diǎn)回滾,但是斷點(diǎn)回滾不像rollBack或commit一樣結(jié)束當(dāng)前事務(wù),而使用斷點(diǎn)回滾只會回滾到聲明斷點(diǎn)的地方,之前的產(chǎn)生的事務(wù)仍需要提交的,如果不提交,事務(wù)一直在數(shù)據(jù)庫中緩存.
Demo:
procedure doSomeThing(p_number out number) as
begin
insert into t_test_user_mingming(id,loginname,password,realname,type)
values(se_test_user_mingming_id.nextval,'xiaoming','1234','小明',1);
p_number := 1;
savepoint ps;--- 設(shè)置斷點(diǎn) ps
insert into t_test_info_mingming(id,pal,type,create_time,note)
values(se_test_info_id.nextval,'我想買臺thinkPad 可以俺莫有錢',1,sysdate,'ceshi');
p_number := 2;
savepoint sp;----設(shè)置斷點(diǎn) sp
insert into t_test_agent(agent_id) values(1);---我這里此行會拋出異常 ORA-01400? 可以替換為下句 手動拋出一個異常
-----RAISE_APPLICATION_ERROR (-20004,'拋出的異常玩玩');
commit;
exception? --捕獲異常
when others then
rollback to ps;? ---- 如果產(chǎn)生異常,回滾到斷點(diǎn) ps
p_number :=0;
commit;? --- 提交事務(wù)
end doSomeThing;
這里本人做了實(shí)驗,如果在異常中不加 commit 語句,使用PL/SQL測試時,異常在緩存,t_test_user_mingming 表中沒有數(shù)據(jù)記錄。
存儲過程里的事務(wù)操作:
create?or?replace?procedure?pr_mypro2(p_a?in?varchar2,p_b?in?varchar2,p_count?out?number)
temp?varchar2(1000);???/*定義臨時變量*/
is
begin
select?code?into?p_count?from?table1?where?a=p_a;?/*查詢并返回值*/
temp?:=?p_count;??/*將返回值賦給臨時變量*/
savepoint?point1;??/*保存點(diǎn)*/
insert?into?table2(a,b)values(temp,p_b);?/*將臨時變量值添加到新表的字段*/
savepoint?point2;
insert?into?
?exception???
??????when???others???then???
??????????rollback?to?savepoint?point1;??/*異常處理,保存點(diǎn)下面的操作都不會被執(zhí)行*/
?????????return;?
end;
保存點(diǎn)(SAVEPOINT)是事務(wù)處理過程中的一個標(biāo)志,與回滾命令(ROLLBACK)結(jié)合使用,主要的用途是允許用戶將某一段處理回滾而不必回滾整個事務(wù)。
如果定義了多個savepoint,當(dāng)指定回滾到某個savepoint時,那么回滾操作將回滾這個savepoint后面的所有操作(即使后面可能標(biāo)記了N個savepoint)。
例如,在一段處理中定義了五個savepoint,從第三個savepoint回滾,后面的第四、第五個標(biāo)記的操作都將被回滾,如果不使用ROLLBACK TO savepoint_name而使用ROLLBACK,將會滾整個事務(wù)處理。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的oracle 存储过程设置回滚点,(转)oracle 存储过程事宜使用断点回滚 -savepoint的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux send 失败_Epoll学
- 下一篇: echart实现3d地图_3D飞线效果—