當前位置:首頁 » 編程語言 » sql捕捉異常
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql捕捉異常

發布時間: 2023-03-06 07:20:35

『壹』 sql 什麼語句能得到異常值

sql都是靠人去寫的,你要根據實際情況來寫sql。若你的item不可能少於10KG,不可能大於50KG,你可以這樣來捕獲異常:

select*frontable_namewhereweight<10orweight>50;

『貳』 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;

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

『叄』 sqlserver2008 在函數中如何捕獲異常

begin try
begin transaction
select 100/0 ---0 不能為除數
commit transaction
print 'transaction committed'
end try
begin catch
rollback
print 'transaction rolled back'
select ERROR_NUMBER() as ErrorNumeber,
ERROR_SEVERITY() as ErrorSeverity,
ERROR_STATE() as ErrorState,
ERROR_MESSAGE() as ErrorMessage;
end catch
go

『肆』 sql server 怎麼捕捉sql語句

如果在Transact-SQL中發生了錯誤,一般有兩種捕捉錯誤的方法,一種是在客戶端代碼(如c#、delphi等)中使用類似try...catch的語句進行捕捉;另外一種就是在Transact-SQL中利用Transact-SQL本身提供的錯誤捕捉機制進行捕捉。如果是因為Transact-SQL語句的執行而產生的錯誤,如鍵值沖突,使用第一種和第二種方法都可以捕捉,但是如果是邏輯錯誤,使用客戶端代碼進行捕捉就不太方便。因此,本文就如何使用Transact-SQL進行錯誤捕捉進行了討論。
非致命錯誤(non-fatal error)的捕捉
通過執行Transact-SQL而產生的錯誤可分為兩種:致命錯誤(fatal error)和非致命錯誤(non-fatal error)。在Transact-SQL中只可以捕捉非致命錯誤(如鍵值沖突),而無法捕捉致命錯誤(如語法錯誤)。在Transact-SQL中可以通過系統變數@@ERROR判斷最近執行的一條語句是否成功執行。如果發生了錯誤,@@Error的值大於0,否則值為0。下面舉一個例子說明@@ERROR的使用。
假設有一個表table1,在這個表中有兩個欄位f1,f2。其中f1是主鍵。
INSERTINTOtable1VALUES(1,'aa')INSERTINTOtable1VALUES(1,'bb')--這條語句將產生一個錯誤IF@@ERROR0PRINT'鍵值沖突'當執行第二條語句時發生鍵值沖突錯誤,@@ERROR被賦為錯誤號2627,因此輸出結果顯示'鍵值沖突'。使用@@ERROR系統變數時需要注意,@@ERROR只記錄最近一次執行的Transact-SQL語句所發生的錯誤,如果最近一次執行的Transact-SQL沒有發生錯誤,@@ERROR的值為0。因此,只能在被捕捉的那條Transact-SQL語句後使用@@ERROR。
在SQL Server中,不僅可以捕捉系統提供的錯誤,還可以自定義錯誤。有兩種方法可以定義錯誤信息。
1. 使用sp_addmessage系統存儲過程添加錯誤信息,然後使用RAISERROR拋出錯誤。
sp_addmessage將錯誤號,錯誤級別、錯誤描述等信息添加到系統表中,然後使用RAISERROR根據相應的錯誤號拋出錯誤信息。用戶自定義的信息應該從50001開始。EXECsp_addmessage@msgnum=50001,
@severity=16,@msgtext='sql encounter an error(%s).',@lang='us_english'EXECsp_addmessage@msgnum=50001,
@severity=16,@msgtext='sql遇到了一個錯誤(%1!).'如果使用的SQL Server版本是非英語版本,在添加本地錯誤信息時必須首先添加英文的錯誤信息。錯誤描述可以象c語言中的printf的格式字元串一樣使用參數,如%s、%d。但要注意的是在英文版的錯誤信息中要使用%s、%d等形式,而在本地化的錯誤信息中要使用%1!、%2!等形式,在每個%?(1 <= ? <= n)後需要加一個!,而且%?的數目必須和英文版的錯誤信息的參數一致。
在未插入本地化錯誤信息時,RAISERROR將使用英文版的錯誤信息。當插入本地化錯誤信息時,RAISERROR使用本地化的錯誤信息。
RAISERROR(50001,16,1,'測試')
輸出的結果:
伺服器: 消息50001
,級別16
,狀態1
,行1sql遇到了一個錯誤(測試).
其中'測試'字元串通過%1傳入本地化的錯誤描述字元串中。
2. 直接使用RAISERROR將錯誤拋出。
使用第一種方法雖然使Transact-SQL語句看上去更整潔(這種方法類似於在編程語言中使用常量定義錯誤信息,然後在不同的地方通過錯誤編號引用這些錯誤信息。),但是這樣做卻使錯誤信息和資料庫的耦合度增加,因為如果將這些帶有RAISERROR的Transact-SQL放到別的SQL Server資料庫上執行,由於在其它的資料庫中還未添加錯誤信息,因此會產生RAISERROR調用錯誤,除非使用sp_addmessage將所需的錯誤信息再加入到其它的資料庫中。
基於上述原因,RAISERROR不僅可以根據錯誤代碼拋出錯誤信息,也可以直接通過錯誤描述格式字元串拋出錯誤信息。

『伍』 如何捕獲sqlserver資料庫的異常

Result.next()只會在兩種情況發生異常:一是資料庫本身故障,二是已經關閉。
而在你的程序中只是為了防止出現一個異常不影響其它的,那麼可以假定了,前面的訪問是正確的。所以,第一個異常原因不可能出現的。而你不會自己主動在另一個線程關閉資料庫吧?那麼第二個異常原因也不可能出現。
所以,這個異常捕獲了,不必做任何處理,直接進行下一個就行。
while(rs.next()){
try{
//..........
}
catch(SQLException ex){}
}