Cmd for Mysql存儲過程 第二章:In、Out與InOut區別 自學第二天(2020.06.01)

一、前言

通過對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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章