怎么理解MySQL中的IN,OUT,INOUT分類
發(fā)表時間:2023-07-20 來源:明輝站整理相關軟件相關文章人氣:
[摘要][sql] viewplain copyMySQL存儲過程中有IN,OUT,INOUT類型 ----------------------------------- ## IN IN參數(shù)只用來...
[sql] view
plain copy
MySQL存儲過程中有IN,OUT,INOUT類型
-----------------------------------
## IN IN參數(shù)只用來向過程傳遞信息,為默認值。
## MySQL存儲過程"in"參數(shù):跟C語言的函數(shù)參數(shù)的值傳遞類似,MySQL存儲過程內部可能會修改此參數(shù),
## 但in類型參數(shù)的修改對調用者(caller)來說是不可見的(not visible)
mysql>use test;
mysql> drop procedure if exists pr_param_in;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> delimiter //
mysql> create procedure pr_param_in(in id int)
-> begin
-> if (id is not null) then
-> set id=id+1;
-> end if;
-> select id as id_inner;
-> end;
-> //
Query OK, 0 rows affected (0.03 sec)
mysql> delimiter ;
mysql> set @id=10;
Query OK, 0 rows affected (0.00 sec)
mysql> call pr_param_in(@id);
+----------+
id_inner
+----------+
11
+----------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> select @id as id_out;
+--------+
id_out
+--------+
10
+--------+
1 row in set (0.00 sec)
## 可以看到用戶變量@id傳入值為10,執(zhí)行存儲過程后,在過程內部值為:11(id_inner),
## 但外部變量值依舊為:10(id_out)
[sql] view
plain copy
<pre name="code" class="sql">==================================================================================
## OUT OUT參數(shù)只用來從過程傳回信息。
## MySQL存儲過程"out"參數(shù):從存儲過程內部傳值給調用者。
## 在存儲過程內部,該參數(shù)初始值為 null,無論調用者是否給存儲過程參數(shù)設置值。
mysql> drop procedure if exists pr_param_out;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> delimiter //
mysql> create procedure pr_param_out(out id int)
-> begin
-> select id as id_inner_1;
-> if (id is not null) then
-> set id=id+1;
-> select id as id_inner_2;
-> else
-> select 1 into id;
-> end if;
-> select id as id_inner_3;
-> end;
-> //
Query OK, 0 rows affected (0.01 sec)
mysql> delimiter ;
mysql> set @id=10;
Query OK, 0 rows affected (0.00 sec)
mysql> call pr_param_out(@id);
+------------+
id_inner_1
+------------+
NULL
+------------+
1 row in set (0.01 sec)
+------------+
id_inner_3
+------------+
1
+------------+
1 row in set (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
mysql> select @id as id_out;
+--------+
id_out
+--------+
1
+--------+
1 row in set (0.00 sec)
## 可以看出,雖然我們設置了用戶定義變量@id為10,傳遞@id給存儲過程后,在存儲過程內部,
## id的初始值總是 null(id_inner_1)。最后id值(id_out=1)傳回給調用者。
===================================================================================
## INOUT INOUT參數(shù)可以向過程傳遞信息,如果值改變,則可再從過程外調用。
## MySQL存儲過程"inout"參數(shù)跟out類似,都可以從存儲過程內部傳值給調用者。
## 不同的是:調用者還可以通過inout參數(shù)傳遞至給存儲過程。
mysql> drop procedure if exists pr_param_inout;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> delimiter //
mysql> create procedure pr_param_inout(inout id int)
-> begin
-> select id as id_inner_1;
-> if (id is not null) then
-> set id=id+1;
-> select id as id_inner_2;
-> else
-> select 1 into id;
-> end if;
-> select id as id_inner_3;
-> end;
-> //
Query OK, 0 rows affected (0.01 sec)
mysql> delimiter ;
mysql> set @id=10;
Query OK, 0 rows affected (0.00 sec)
mysql> call pr_param_inout(@id);
+------------+
id_inner_1
+------------+
10
+------------+
1 row in set (0.00 sec)
+------------+
id_inner_2
+------------+
11
+------------+
1 row in set (0.00 sec)
+------------+
id_inner_3
+------------+
11
+------------+
1 row in set (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
mysql> select @id as id_out;
+--------+
id_out
+--------+
11
+--------+
1 row in set (0.00 sec)
## 從結果可以看出:我們把 @id(10)傳給存儲過程后,存儲過程最后又把計算結果值11(id_inner_3)
## 傳回給調用者。MySQL存儲過程inout參數(shù)的行為跟C語言函數(shù)中的引用傳值類似。
=========================================================================================
通過以上例子:
1) 如果僅僅想把數(shù)據(jù)傳給MySQL存儲過程,那就用in類型參數(shù);
2) 如果僅僅從MySQL存儲過程返回值,那就用out類型參數(shù);
3) 如果需要把數(shù)據(jù)傳給MySQL存儲過程經(jīng)過計算再傳回給我們,那就用inout類型參數(shù)。
以上就是如何理解MySQL中的IN,OUT,INOUT類型的詳細內容,更多請關注php中文網(wǎng)其它相關文章!
學習教程快速掌握從入門到精通的SQL知識。