當前位置:首頁 » 存儲配置 » mysql存儲過程異常處理

mysql存儲過程異常處理

發布時間: 2022-06-30 22:55:59

A. mysql存儲過程中如何定義錯誤處理

declare是用來定義變數和常用處理、聲明之類的關鍵字。在mysql存儲過程出現之前declare是一塊雞肋,大家常用declare來定義局部變數,我習慣性的還是使用set來定義變數(雖然是全局的,但是來的方便)。 存儲過程出現後declare的標准處理定義就變成了非常強大的工具,可以用來為存儲過程添加一些非常強大的錯誤處理機制。 首先需要提一點的是declare定義變數如果想定義varchar型的,必須註明參數最大長度,即declare varchar(20). 在這里我們不深究它用來定義參數的小細節 我們主要來研究DECLARE Condition 和 DECLARE Handler DECLARE Condition 和 DECLARE Handler可以說是為了處理錯誤而生的。 功能上講DECLARE Condition出現的時間比較早,功能也比較簡單,它可以通過錯誤編號或者SQLSTATE來觸發一各名字,說明白一點就是當某個錯誤編號出現的時候替換一個名字給它。這樣調用的時候,我們不用去記一大串錯誤編號了。 它的標准語法我們可以在mysql的附註中找到。 DECLARE condition_name CONDITION FOR condition_value condition_value:例子如下:DECLARE errname CONDITION FOR SQLSTATE '23000' 將返回SQLSTATE信息為23000的錯誤定名為errname 這個名字就可以被我們的絕對重頭戲DECLARE Handler調用了,在DECLARE Handler中可以定義錯誤的處理辦法,可以使用begin和end來標記語句塊,可以單獨使用rollback。處理的過程也可以定義為繼續執行和中斷存儲過程。 標准語法:DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement handler_type: 處理的過程。 CONTINUE 繼續執行未完成的存儲過程,直至結束。(常用,默認) | EXIT 出現錯誤即自動跳出所在的begin不再執行後面的語句。 condition_value: 處理的觸發條件 SQLSTATE [VALUE] sqlstate_value 不用說了,最常用的錯誤定義,自己去查錯誤列表吧。 | condition_name 我們剛剛定義的那個名字errnmae就是用在這里的。 | SQLWARNING 這個太好用了,從錯誤編號01開始的錯誤。相當於錯誤的通配符。 | NOT FOUND 和上面差不多,從02開始。 | SQLEXCEPTION 上面兩個中沒有包括的錯誤它都可以用來觸發,就是說你想定義只要出錯就觸發的話就定義出錯條件為SQLWARNING+SQLEXCEPTION。 | mysql_error_code 錯誤編號,和第一個不一樣,不過同樣可以在錯誤列表從中查到,是我比較常用的。 例子DECLARE errname CONDITION FOR SQLSTATE '23000'; 給導致錯誤23000的錯誤定義名字為errname DECLARE continue handler for errname 當errname發生時作下面的處理 BEGIN 語句開始 set @x=1; 設置@x=1

B. 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;

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

C. mysql 存儲過程 異常 是否自動 回滾

是滴,默認是隱式的開始與提交,出現異常會默認自動回滾到開始位置,任何一個使用JDBC操作資料庫的SQL命令,在默認情況下,隱式開始與提交事務。當顯示的調用事物時,就必須顯示使用commit當使用rollback後也要進行commit;

D. mysql存儲過程執行一半出現異常會怎麼辦

如果在存儲過程調用的時候顯式的調用了事務處理,那麼,會回滾,否則執行到那裡就在哪裡生效。

E. mysql存儲過程出錯

mysql> create PROCEDURE sp_GetPageRecord( IN TableName VARCHAR(100), IN Primar
yKey VARCHAR(50), IN Col1 VARCHAR(255) , IN WhereSql VARCHAR(255) , IN Sort V
ARCHAR(200) , IN PageSize INT , IN CurrPage INT, IN IsDesc BIT(1) ) BEGIN END;
Query OK, 0 rows affected (0.00 sec)

當然首先要確認下MySQL版本。MySQL從5.0版本開始支持存儲過程
一、VARCHAR類型最多支持255個字元,超過255個字元可以考慮用TEXT變數。TEXT變數支持最大到65536個位元組。
二、不支持參數中的DEFAULT值。也就是說 = ...這樣的要去掉。
三、必須要有過程體,過程體的開始與結束使用BEGIN與END進行標識。
四、BIT類型支持1-64位的存儲。
五、存儲過程中SELECT ... INTO var_list中var_list不能用存儲過程的參數。
六、下面需要注意的是DELIMITER //和DELIMITER ;兩句,DELIMITER是分割符的意思,因為MySQL默認以";"為分隔符,如果我們沒有聲明分割符,那麼編譯器會把存儲過程當成SQL語句進行處理,則存儲過程的編譯過程會報錯,所以要事先用DELIMITER關鍵字申明當前段分隔符,這樣MySQL才會將";"當做存儲過程中的代碼,不會執行這些代碼,用完了之後要把分隔符還原。
七、存儲過程根據需要可能會有輸入、輸出、輸入輸出參數,這里有一個輸出參數s,類型是int型,如果有多個參數用","分割開。
參數
MySQL存儲過程的參數用在存儲過程的定義,共有三種參數類型,IN,OUT,INOUT,形式如:
CREATE PROCEDURE([[IN |OUT |INOUT ] 參數名 數據類形...])
IN 輸入參數:表示該參數的值必須在調用存儲過程時指定,在存儲過程中修改該參數的值不能被返回,為默認值
OUT 輸出參數:該值可在存儲過程內部被改變,並可返回
INOUT 輸入輸出參數:調用時指定,並且可被改變和返回

在mysql命令提示符下逐行輸入下面的語句。
delimiter //
create procere `demo_out_total`(IN tbl_name varchar(255), IN whereClause varchar(255), OUT
total_tbl int)
BEGIN
DECLARE t_status int default 0;
DECLARE v_sql VARCHAR(500);
DECLARE continue HANDLER FOR SQLSTATE '23000' SET t_status = 1;
DECLARE continue HANDLER FOR SQLEXCEPTION SET t_status = 2;
set v_sql = CONCAT('select count(*) into @total from ',tbl_name, ' where ',whereClause, '
;');
select v_sql;
SET @total = 0;
SET @v_sql = v_sql;
PREPARE record FROM @v_sql;
EXECUTE record;
DEALLOCATE PREPARE record;
select @total;
set total_tbl = @total;
END;
//

/* sp demo_out_total2 use curson */
create procere `demo_out_total2`(IN tbl_name varchar(255), IN whereClause varchar(255), OUT total_tbl int)
BEGIN
DECLARE t_status int default 0;
DECLARE c_total CURSOR for SELECT total from tmptable ;
DECLARE continue HANDLER FOR SQLSTATE '23000' SET t_status = 1;
DECLARE continue HANDLER FOR SQLEXCEPTION SET t_status = 2;
set @v_sql = 'drop table tmptable if exist tmptable;';
PREPARE record FROM @v_sql;
EXECUTE record;
DEALLOCATE PREPARE record;

set @v_sql = CONCAT('create table tmptable as select count(*) total from ',tbl_name,' where ',whereClause,';');
PREPARE record FROM @v_sql;
EXECUTE record;
DEALLOCATE PREPARE record;

OPEN c_total;
FETCH c_total INTO total_tbl;
CLOSE c_total;
END;
//
delimiter ;

set @tbl_name = 'tb2';
set @whereClause = 'tid= 237';
set @total_tbl = 0;
call demo_out_total(@tbl_name,@whereClause,@total_tbl);
select @total_tbl;

詳見MySQL存儲過程詳解:
http://wenku..com/link?url=_W2ft5HNybWw5fBTPIFWEx--gAbNvgADf0wGk0s43QSoA2_Ci3ztQOKdO25uS85BJSdHK

MySQL存儲程序入門指南:
http://www.cnblogs.com/wxb-km/archive/2012/11/18/2775780.html

MySQL create procere語句參考:
http://dev.mysql.com/doc/refman/5.6/en/create-procere.html
http://dev.mysql.com/doc/refman/5.6/en/cursors.html
http://dev.mysql.com/doc/refman/5.6/en/sql-syntax-prepared-statements.html

MySQL數據類型存儲要求:
http://dev.mysql.com/doc/refman/5.6/en/storage-requirements.html

F. mysql的一個存儲過程,一直報錯,缺沒發現錯誤在哪求指點!

可以運行的,你把char類型加個整數1,類型轉換錯誤,就報異常了,存儲過程字元用varchar類型的比較多一些。

G. mysql 存儲過程出現死鎖

產生死鎖的四個必要條件:
(1) 互斥條件:一個資源每次只能被一個進程使用。
(2) 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
(3) 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。
(4) 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。
這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之
一不滿足,就不會發生死鎖。

熱點內容
struts2訪問方法 發布:2024-04-26 19:11:36 瀏覽:258
外文翻譯android 發布:2024-04-26 19:03:30 瀏覽:89
土金木配置怎麼樣 發布:2024-04-26 18:52:50 瀏覽:610
這台電腦如何訪問另一台電腦伺服器 發布:2024-04-26 18:51:08 瀏覽:627
怎麼快速了解電腦的配置 發布:2024-04-26 18:42:11 瀏覽:997
rsa加密演算法例子 發布:2024-04-26 18:40:29 瀏覽:243
thinkphp緩存關閉 發布:2024-04-26 18:19:32 瀏覽:96
linux信號捕捉 發布:2024-04-26 18:19:27 瀏覽:934
編譯有哪兩種模式 發布:2024-04-26 17:53:30 瀏覽:871
伺服器電腦上能用嗎 發布:2024-04-26 17:44:42 瀏覽:560