當前位置:九游会j9娱乐平台-九游ag登录中心网址 » 編程語言 » sql捕獲異常

sql捕獲異常-九游会j9娱乐平台

發布時間: 2024-07-10 09:50:30

⑴ 如何在sql存儲過程中處理錯誤

一、存儲過程中使用事務的簡單語法
在存儲過程中使用事務時非常重要的,使用數據可以賀銷保持數據的關聯完整性,在sql server存儲過程中使用事務也很簡單,用一個例子來說明它的語法格式:
create procere myprocere
( @param1 nvarchar(10),
@param2 nvarchar(10)
)
as
begin
set nocount on;
set xact_abort on;
begin tran
delete from table1 where name=』abc』;
insert into table2 values(value1,value2,value3);
commit tran
end

說明:
1 、使用存儲過程執行事物,需要開啟xact_abort參數(默認值為off),將該參數設置為on,表示當執行事務時,如果出錯,會將transcation設置為uncommittable狀態,那麼在語句塊批處理結束後將回滾所有操作;如果該參數設置為off,表示當執行事務時,如果出錯,出錯的語句將不會執行,其他正確的操作繼續執行。

2、當set nocount 為 on 時,不返回計數(計數表示受 transact-sql 語句影響的行數,例如在sql server查詢分析器中執行一個delete操作後,下方窗口會提示(3)rows affected)。當 set nocount 為 off 時,返回計數,我們應該在存儲過程的頭部加上set nocount on 這樣的話,在退出存儲過程的時候加上 set nocount off這樣的話,以達到優化存儲過程的目的。

二、事務內設置保存點
用戶可以在事務內設置保存點或標記。保存點定義如果有條件地取消事務的一部分,事務可以返回的位置。如果將事務回滾到保存點,則必須(如果需要,使用更多的 transact-sql 語句和 commit transaction 語句)繼續完成事務,或者必須(通過將事務回滾到其起始點)完全取消事務。若要取消整個事務,請使用 rollback transaction transaction_name 格式。這將撤消事務的所有語句和過程。如:
代碼
create procere myprocere
as
begin
set nocount on;
set xact_abort on;
begin tran ok --開始一個事務ok
delete from rxqz where qz= 'rx015 ' --刪除數據
save tran bcd --保存一個事務點命名凱肆為bcd
update sz set name='李麗s' where name= '李麗'--修改數據

if @@error<>0 --判斷修改數據有沒有出錯
begin --如果出錯
rollback tran bcd -- 回滾事務到bcd 的還原點
commit tran ok --提交事務
end
else --沒有出錯
commit tran ok --提交事務
end

說明:1、@@error判斷是否有錯誤,為0表示沒有盯拍轎錯誤,但是對那種重大錯誤無法捕捉,而且@@error只能前一句sql語句生效。

三、存儲過程使用try…catch捕獲錯誤
在存儲過程中可以使用try…catch語句來捕獲錯誤,如下:

create procere myprocere
( @param1 nvarchar(10),
@param2 nvarchar(10)
)
as
begin
set nocount on;
begin try
delete from table1 where name=』abc』;
insert into table2 values(value1,value2,value3);
end try
begin catch
select error_number() as errornumber,
error_message() as errormessage;
end catch
end

說明:1、捕獲錯誤的函數有很多,如下:
error_number() 返回錯誤號。
error_severity() 返回嚴重性。
error_state() 返回錯誤狀態號。
error_procedure() 返回出現錯誤的存儲過程或觸發器的名稱。
error_line() 返回導致錯誤的常式中的行號。
error_message() 返回錯誤消息的完整文本。該文本可包括任何可替換參數所提供的值,如長度、對象名或時間。
2、有些錯誤,如sql語句中的表名稱輸入錯誤,這是資料庫引擎無法解析這個表名稱時,所發生的錯誤在當前的try…catch語句中無法捕獲,必須由外層調用該存儲過程的地方使用 try…catch來進行捕獲。

四、存儲過程中事務和try…catch聯合使用
在存儲過程中使用事務時,如果沒有try…catch語句,那麼當set xact_abort on時,如果有錯誤發生,在批處理語句結束後,系統會自動回滾所有的sql操作。當set xact_abort off時,如果有錯誤發生,在批處理語句結束後,系統會執行所有沒有發生錯誤的語句,發生錯誤的語句將不會被執行。
在存儲過程中使用事務時,如果存在try…catch語句塊,那麼當捕獲到錯誤時,需要在catch語句塊中手動進行rollback操作,否則系統會給客戶端傳遞一條錯誤信息。如果在存儲過程開始處將set xact_abort on,那麼當有錯誤發生時,系統會將當前事務置為不可提交狀態,即會將xact_state()置為-1,此時只可以對事務進行rollback操作,不可進行提交(commit)操作,那麼我們在catch語句塊中就可以根據xact_state()的值來判斷是否有事務處於不可提交狀態,如果有則可以進行rollback操作了。如果在存儲過程開始處將set xact_abort off,那麼當有錯誤發生時,系統不會講xact_state()置為-1,那麼我們在catch塊中就不可以根據該函數值來判斷是否需要進行rollback了,但是我們可以根據@@trancount全局變數來判斷,如果在catch塊中判斷出@@trancount數值大於0,代表還有未提交的事務,既然進入catch語句塊了,那麼還存在未提交的事務,該事務應該是需要rollback的,但是這種方法在某些情況下可能判斷的不準確。推薦的方法還是將set xact_abort on,然後在catch中判斷xact_state()的值來判斷是否需要rollback操作。
下面我們來看看兩個例子:
一.使用set xact_abort on

create proc myprocere
as
begin
set xact_abort on;
begin try
begin tran
insert into teststu values('terry','boy',23);
insert into teststu values('mary','girl',21);
commit tran
end try
begin catch
--在此可以使用xact_state()來判斷是否有不可提交的事務,不可提交的事務
--表示在事務內部發生錯誤了。xact_state()有三種值:-1.事務不可提交;
--1.事務可提交;0.表示沒有事務,此時commit或者rollback會報錯。
if xact_state()=-1
rollback tran;
end catch
end

二.使用set xact_abort off

create proc myprocere
as
begin
set xact_abort off;
begin try
begin tran
insert into teststu values('terry','boy',23);
insert into teststu values('mary','girl',21);
commit tran
end try
begin catch
--在此不可以使用xact_state來判斷是否有不可提交的事務
--只可以使用@@trancount來判斷是否有還未提交的事務,未提交的事務未必
--就是不可提交的事務,所以使用@@trancount>0後就rollback是不準確的
if @@trancount>0
rollback tran;
end catch
end

另外,對於@@trancount需要說明的是,begin tran 語句將 @@trancount加 1。rollback tran將 @@trancount遞減到 0,但 rollback tran savepoint_name 除外,它不影響 @@trancount。commit tran 或 commit work 將 @@trancount 遞減 1。

⑵ mysql 存儲過程 中怎麼捕獲異常

declare處理程序的使用:

declare handler_type handler for condition_value[,...] sp_statement

其中,

handler_type的取值范圍:continue | exit | undo

condition_value的取值范圍:sqlstate [value] sqlstate_value | condition_name | sqlwarning | not found | sqlexception | mysql_error_code

這個語句指定每個可以處理一個或多個條件的處理程序。如果產生一個或多個條件,指定的語句被執行。對一個continue處理程序,當前子程序的執行在執行處理程序語句之後繼續。對於exit處理程序,當前begin...end復合語句的執行被終止。undo 處理程序類型語句還不被支持。

· sqlwarning是對所有以01開頭的sqlstate代碼的速記。

· not found是對所有以02開頭的sqlstate代碼的速記。

· sqlexception是對所有沒有被sqlwarning或not found捕獲的sqlstate代碼的速記。

註:除了sqlstate值,mysql錯誤代碼也不被支持。


例:

[sql]viewplainprint?
delimiter$$

createtable`_t1`(
`id`int(11)notnullauto_increment,
`val1`varchar(20)defaultnull,
`val2`int(11)defaultnull,
primarykey(`id`)
)engine=innodbauto_increment=113defaultcharset=latin1$$
[sql]viewplainprint?
delimiter$$

createdefiner=`abandonship`@`%`procedure`p_testexception`()
begin
declare_var,_errintdefault0;
,sqlwarning,notfoundset_err=1;
insertinto_t1(val1,val2)value(2012,'abandonship');
if_err=1then
set_var=2;
endif;

selectcasewhen_var=2then'出錯了'else_varend;

調用該存儲過程將返回:出錯了

⑶ oracle涓鎬庝箞鑾峰緱sql璇鍙ョ殑閿欒淇℃伅

鏈変竴縐嶅姙娉曪紝鍙浠ュ硅〃榪涜屽¤°
init鏂囦歡鐨勫弬鏁板繀欏伙細
audit_trail=db
姣斿傦細

鐢╱ser鐢ㄦ埛鐧婚檰.鎵撶畻瀵硅〃user.test鐨勬彃鍏ユ搷浣滃仛瀹¤.
鎿嶄綔濡備笅:
audit insert on user.test;

鎵ц屼綘鐨勮鍙ワ細
insert into test values (....);
鏌ヨsql鎵ц屾儏鍐碉細
select * from sys.aud$;

熱點內容
仙境傳說手游腳本 發布:2024-07-17 16:09:24 瀏覽:690
matlab命令窗口和新建腳本 發布:2024-07-17 15:51:26 瀏覽:374
建ftp文件夾 發布:2024-07-17 15:51:26 瀏覽:954
魔獸撿物腳本 發布:2024-07-17 15:27:56 瀏覽:129
開發ip伺服器 發布:2024-07-17 15:24:42 瀏覽:387
安卓系統視頻製作哪個好用 發布:2024-07-17 15:10:47 瀏覽:210
androidapk結構 發布:2024-07-17 15:10:43 瀏覽:945
c語言指針的例子 發布:2024-07-17 15:08:01 瀏覽:768
linuxzcat 發布:2024-07-17 15:02:09 瀏覽:901
賓士編程嗎 發布:2024-07-17 14:57:08 瀏覽:853
网站地图