mysql學習筆記:存儲過程

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
喜歡就支持一下吧
點贊12 分享