目錄
一、前言
通過對cmd實現存儲過程的操作與調用,初步瞭解存儲過程;存儲過程常用三種參數類型,分別有啥區別?
瞭解這些基本內容對我們後面複雜存儲過程的應用與實現,能夠根據精確把握。
二、需求與資料準備
需求:通過cmd的方式實現,IN、OUT、INOUT三種參數的存儲過程,參數在調用過程中的變化。
準備:test表,字段id、字段name;
知識點:
①基本cmd創建存儲過程,可參考文章【1】;
②delimiter:修改分割符固定語句;
③@變量名:如@testname,固定格式;
④call 存儲過程名(參數):如call testIn(@testname)。
存儲過程:
①IN 輸入參數:表示調用者向過程傳入值(傳入值可以是字面量或變量)
②OUT 輸出參數:表示過程向調用者傳出值(可以返回多個值)(傳出值只能是變量)
③INOUT 輸入輸出參數:既表示調用者向過程傳入值,又表示過程向調用者傳出值(值只能是變量)
特別說明
①mysql>是cmd操作界面自帶,不屬於命令;
②===註釋說明=:這是文章的註釋說明,命令行中沒有;初學者參考時注意。
三、IN存儲過程
1.IN的操作命令
=====修改分隔符============
mysql> delimiter //
=====創建存儲過程命令=======
mysql> create procedure testIn(in testname int)
-> begin
-> select testname;
-> set testname=99;
-> select testname;
-> end
-> //
=====修改分隔符===========
mysql>demiliter ;
2.IN返回結果
=====設置變量========
mysql> set @testname=1;
Query OK, 0 rows affected (0.00 sec)
=====調用存儲過程====
mysql> call testIn(@testname);
=====返回結果1=======
+----------+
| testname |
+----------+
| 1 |
+----------+
1 row in set (0.00 sec)
=====返回結果2=======
+----------+
| testname |
+----------+
| 99 |
+----------+
1 row in set (0.01 sec)
=====查看變量testname變化情況=======
mysql> select @testname;
+-----------+
| @testname |
+-----------+
| 1 |
+-----------+
1 row in set (0.00 sec)
3.IN調用結果分析
上述調用過程,觀察@testname的值的變化
結果1:接收參數,值爲1;
結果2:修改參數,值爲99;
結果3:未修改參數,值爲1;傳入參數,無法修改參數。
四、OUT存儲過程
1.OUT的操作命令
=====修改分隔符============
mysql> delimiter //
=====創建存儲過程命令=======
mysql> create procedure testOut(in testname int)
-> begin
-> select testname;
-> set testname=99;
-> select testname;
-> end
-> //
=====修改分隔符===========
mysql>demiliter ;
2.OUT返回結果
=====設置變量========
mysql> set @testname=1;
Query OK, 0 rows affected (0.00 sec)
=====調用存儲過程====
mysql> call testIn(@testname);
=====返回結果1=======
+----------+
| testname |
+----------+
| NULL|
+----------+
1 row in set (0.00 sec)
=====返回結果2=======
+----------+
| testname |
+----------+
| 99 |
+----------+
1 row in set (0.01 sec)
=====查看變量testname變化情況=======
mysql> select @testname;
+-----------+
| @testname |
+-----------+
| 99 |
+-----------+
1 row in set (0.00 sec)
3.OUT結果分析
上述調用過程,觀察@testname的值.
結果1:參數爲NULL,表示未接收到參數值;
結果2:參數爲99,參數值被修改;
結果3:參數爲99,說明OUT存儲過程修改了參數。
五、INOUT存儲過程
1.INOUT的操作命令
=====修改分隔符============
mysql> delimiter //
=====創建存儲過程命令=======
mysql> create procedure testInOut(inout testname int)
-> begin
-> select testname;
-> set testname=99;
-> select testname;
-> end
-> //
=====修改分隔符===========
mysql>demiliter ;
2.INOUT返回結果
=====設置變量========
mysql> set @testname=1;
Query OK, 0 rows affected (0.00 sec)
=====調用存儲過程====
mysql> call testInOut(@testname);
=====返回結果1=======
+----------+
| testname |
+----------+
| NULL|
+----------+
1 row in set (0.00 sec)
=====返回結果2=======
+----------+
| testname |
+----------+
| 99 |
+----------+
1 row in set (0.01 sec)
=====查看變量testname變化情況=======
mysql> select @testname;
+-----------+
| @testname |
+-----------+
| 99 |
+-----------+
1 row in set (0.00 sec)
3.INOUT結果分析
上述調用過程,觀察@testname的值.
結果1:參數爲1,表示接收到參數值;
結果2:參數爲99,參數值被修改;
結果3:參數爲99,說明INOUT存儲過程修改參數。
六、IN/OUT/INOUT區別分析
IN 輸入參數:調用者只傳遞參數,參數不會修改;
OUT 輸出參數:調用者輸出參數,不接收參數,所以最開始爲NULL。當調用者修改了參數後,參數被修改。
INOUT輸入輸出參數:接受了輸入的參數,也輸出參數;
特別說明:
①整個創建與調用過程,大家需要充分理解三種存儲過程的差異。跟着參數變化,分析存儲過程執行過程。
②在整個命令創建過程,出現最多的是錯誤的字符,導致整個存儲過程重新編寫,如果遇到非常複雜的存儲過程,重新編寫命令是非常複雜繁瑣的事情。
遺留學習問題
是否cmd命令在這種情況可以不用重新輸入命令,可以直接修改部分就可以呢???這塊各位大神有解決方式歡迎指導評論。下章學習重點是突破這個問題。
七、參考文章
【1】初學cmd命令創建存儲過程:https://blog.csdn.net/qq_38039130/article/details/106451346;
【2】菜鳥教程MySQL 存儲過程:https://www.runoob.com/w3cnote/mysql-stored-procedure.html;
【3】博客園MySQL 存儲過程參數IN OUT INOUT對比:https://www.cnblogs.com/weibanggang/p/9664709.html;