存儲過程是數據庫的一個重要的功能,MySQL 5.0以前並不支持存儲過程,這使得MySQL在應用上大打折扣。好在MySQL 5.0開始支持存儲過程,這樣即可以大大提高數據庫的處理速度,同時也可以提高數據庫編程的靈活性。
MySQL存儲過程的創建
語法
CREATE PROCEDURE 過程名([[IN|OUT|INOUT] 參數名 數據類型[,[IN|OUT|INOUT] 參數名 數據類型…]]) [特性 ...] 過程體
DELIMITER // CREATE PROCEDURE myproc(OUT s int) BEGIN SELECT COUNT(*) INTO s FROM students; END // DELIMITER ;
MySQL默認以";"為分隔符,如果沒有聲明分割符,則編譯器會把存儲過程當成SQL語句進行處理,因此編譯過程會報錯,所以要事先用“DELIMITER //”聲明當前段分隔符,讓編譯器把兩個"//"之間的內容當做存儲過程的代碼,不會執行這些代碼;“DELIMITER ;”的意為把分隔符還原。
參數
存儲過程根據需要可能會有輸入、輸出、輸入輸出參數,如果有多個參數用","分割開。MySQL存儲過程的參數用在存儲過程的定義,共有三種參數類型,IN,OUT,INOUT:
IN參數的值必須在調用存儲過程時指定,在存儲過程中修改該參數的值不能被返回,為默認值OUT:該值可在存儲過程內部被改變,並可返回INOUT:調用時指定,並且可被改變和返回
過程體
過程體的開始與結束使用BEGIN與END進行標識。
MySQL實例與講解
1. 創建一存儲過程,求l+2+3+…+n,並打印結果。
先使用MySQL語句創建存儲過程,再使用call語句調用這一存儲過程查看結果,可以看到由於未輸入n的值,sum結果為0。
DELIMITER // CREATE PROCEDURE addresult() BEGIN DECLARE i INT; DECLARE sum INT; DECLARE n INT; SET i = 1; SET sum = 0; WHILE i <= n DO SET sum = sum + i; SET i = i + 1; END WHILE; SELECT SUM; END // DELIMITER ;
在navicat 實現


2.調用上面的addresult存儲過程,打印l十2+3+…+10的結果。
在第一題的addresult過程基礎上,加上一條“set n=10”語句,設定n的值,調用該過程后打印結果,可以看到結果為sum=1+2+3+...+10=55。


3. 修改上述存儲過程為addresult1,使得n為輸入參數,其具體值由用戶調用此存儲過程時指定。



這是輸入10的結果
也可以這樣寫,這樣更簡潔

4.調用上面修改后的addresult1存儲過程,打印l+2+3+…+100的結果。

5. 修改上述存儲過程為addresult2,將n參數設定默認值為100,並改設sum為輸出參數,讓主程序能夠接收計算結果。
將3中存儲過程中的“in n int”修改為“out sum int”,並在存儲過程中設定n默認值為100。



或者手動輸入值



如何接受返回參數的值呢?這里涉及到MySQL的變量
MySQL變量一共有三種:
全局變量
全局變量又叫內置變量,是mysql數據庫內置的變量 ,對所有連接都起作用。
查看所有全局變量: show variables
查看某個全局變量: select @@變量名
修改全局變量: set 變量名=新值
character_set_client: mysql服務器的接收數據的編碼
character_set_results:mysql服務器輸出數據的編碼
會話變量
只存在於當前客戶端與數據庫服務器端的一次連接當中。如果連接斷開,那么會話變量全部丟失!
定義會話變量: set @變量=值
查看會話變量: select @變量
局部變量
在存儲過程中使用的變量就叫局部變量。只要存儲過程執行完畢,局部變量就丟失。
回到上面這個存儲過程,如何接受返回參數的值呢?
定義一個會話變量name, 使用name會話變量接收存儲過程的返回值
CALL pro_testOut(@NAME);
查看變量值
SELECT @NAME;
OUT修飾的參數,調用時就是這樣,如果你傳入一個常量,就會報錯
參數inout的使用(既能輸入一個值又能傳出來一個值)
傳一個年齡,自動讓年齡增長10歲



怎么OUT呢?例如
@abcd是沒有事先定義的變量,是NULL值
這里直接調用的話也是為NULL
@abc是之前out的值,所以調用加10等於5060

這樣看會更清晰
定義@ab=1,然后調用加10,得出11,這個也變量可以繼續調用


更多后續參考
參考:https://blog.csdn.net/weixin_41177699/article/details/80553643?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-2.control
簡單易懂參考
https://blog.csdn.net/xushouwei/article/details/52198065
包含函數的也可以參考https://www.jianshu.com/p/f01235e7ea33
