use?test; drop?table?if?exists?t8; CREATE?TABLE?t8(s1?INT,PRIMARY?KEY(s1)); drop?procedure?if?exists?handlerdemo; DELIMITER?$$ CREATE?PROCEDURE?handlerdemo() BEGIN declare?xx?int?default?4; DECLARE?oh_no?condition?for?sqlstate?'23000'; #DECLARE?CONTINUE?HANDLER?FOR?SQLSTATE?'23000'?SET?@X2=1; declare?exit?handler?for?oh_no?set?@info='違反主鍵約束'; SET?@X=1; INSERT?INTO?t8?VALUES(1); SET?@X=2; INSERT?INTO?t8?VALUES(1); SET?@X=3; END
調用存儲過程
/*?調用存儲過程*/ CALL?handlerdemo(); /*?查看調用存儲過程結果*/ SELECT?@X,@info;
心得體會:
1、語句結束符
也許mysql是將存儲過程、自定義函數看作一條語句的,因此,存儲過程里多條語句用“;”隔開,為了避免沖突,就要用delimiter 重新定義結束符。
一般可以在存儲過程開始前,定義新的結束符,如?
delimiter //
存儲過程書寫完畢以后,再恢復定義:delimiter ;
2、變量
mysql的變量,跟SQL SERVER一樣,形如 @X ,但無需聲明,直接使用。
而在存儲過程里面,變量無須用 @,但要聲明。并且聲明要放在存儲過程的頭部(?),如本例,否則報錯。真奇怪啊,一方面,有時候變量無須聲明就可以使用,另一方面,有時候又要限定聲明位置,令人無所適從,似乎隨便了點。
存儲過程內部的變量,作用范圍僅限于存儲過程。但那些帶@的變量,卻仿佛可以跨越會話和連接,看上去是全局變量?如上面的例子。
3、條件和處理
定義條件,是為了給處理調用。如上面的例子:
DECLARE?oh_no?condition?for?sqlstate?'23000'; #DECLARE?CONTINUE?HANDLER?FOR?SQLSTATE?'23000'?SET?@X2=1; declare?exit?handler?for?oh_no?set?@info='違反主鍵約束';
以上就是以上就是的內容,更多相關內容請關注PHP中文網(www.php.cn)!的內容,更多相關內容請關注PHP中文網(www.php.cn)!
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END