MySQL存儲過程中有IN即彪,OUT紧唱,INOUT類型
-----------------------------------
## IN ? IN參數(shù)只用來向過程傳遞信息,為默認值隶校。
## MySQL存儲過程"in"參數(shù):跟C語言的函數(shù)參數(shù)的值傳遞類似漏益,MySQL存儲過程內(nèi)部可能會修改此參數(shù),
## 但in類型參數(shù)的修改對調(diào)用者(caller)來說是不可見的(not visible)
mysql>use test;
mysql> drop procedureifexists pr_param_in;
QueryOK,0rows affected,1warning (0.01sec)
mysql> delimiter //
mysql> create procedure pr_param_in(inid int)
? ? -> begin
? ? ->if(id is not null) then
? ? ->? ? set id=id+1;
? ? -> endif;
? ? -> select idasid_inner;
? ? -> end;
? ? -> //
QueryOK,0rows affected (0.03sec)
mysql> delimiter ;
mysql> set @id=10;
QueryOK,0rows affected (0.00sec)
mysql> call pr_param_in(@id);?
+----------+
| id_inner |?
+----------+
|11|?
+----------+
1rowinset (0.00sec)QueryOK,0rows affected (0.00sec)
mysql> select @id as id_out;
?+--------+
| id_out |?
+--------+
|10|?
+--------+
1rowinset (0.00sec)
## ?可以看到用戶變量@id傳入值為10深胳,執(zhí)行存儲過程后绰疤,在過程內(nèi)部值為:11(id_inner),
## ?但外部變量值依舊為:10(id_out)
==================================================================================
## OUT ? OUT參數(shù)只用來從過程傳回信息。
## MySQL存儲過程"out"參數(shù):從存儲過程內(nèi)部傳值給調(diào)用者稠屠。
## 在存儲過程內(nèi)部峦睡,該參數(shù)初始值為 null,無論調(diào)用者是否給存儲過程參數(shù)設置值权埠。
mysql> drop procedureifexists pr_param_out;
QueryOK,0rows affected,1warning (0.01sec)
mysql> delimiter //
mysql> create procedure pr_param_out(out id int)
? ? -> begin
? ? -> select idasid_inner_1;?
?? ->if(id is not null) then
? ?->? ? set id=id+1;
? ? ->? ? select idasid_inner_2;?
?? ->else->? ? select1into id;
? ? -> endif;
? ? -> select idasid_inner_3;
? ? -> end;
? ? -> //
QueryOK,0rows affected (0.01sec)
mysql> delimiter ;
mysql> set @id=10;
QueryOK,0rows affected (0.00sec)
mysql> call pr_param_out(@id);?
+------------+
| id_inner_1 |?
+------------+
|NULL|?
+------------+
1rowinset (0.01sec)?
+------------+
| id_inner_3 |?
+------------+
|1|
?+------------+
1rowinset (0.01sec)
QueryOK,0rows affected (0.01sec)
mysql> select @idasid_out;?
+--------+
| id_out |
+--------+
|1|?
+--------+
1rowinset (0.00sec)
## 可以看出榨了,雖然我們設置了用戶定義變量@id為10,傳遞@id給存儲過程后攘蔽,在存儲過程內(nèi)部龙屉,
## id的初始值總是 null(id_inner_1)。最后id值(id_out=1)傳回給調(diào)用者。
===================================================================================
## INOUT INOUT參數(shù)可以向過程傳遞信息转捕,如果值改變作岖,則可再從過程外調(diào)用。
## MySQL存儲過程"inout"參數(shù)跟out類似五芝,都可以從存儲過程內(nèi)部傳值給調(diào)用者痘儡。
## 不同的是:調(diào)用者還可以通過inout參數(shù)傳遞至給存儲過程。
mysql> drop procedureifexists pr_param_inout;
QueryOK,0rows affected,1warning (0.01sec)
mysql> delimiter //
mysql> create procedure pr_param_inout(inout id int)
? ? -> begin
? ? -> select idasid_inner_1;
? ? ->if(id is not null) then
? ? ->? ? set id=id+1;
? ? ->? ? select idasid_inner_2;
? ? ->else
? ? ->? ? select 1 into id;
? ? -> endif;
? ? -> select id as id_inner_3;
? ? -> end;
? ? -> //
QueryOK,0rows affected (0.01sec)
mysql> delimiter ;
mysql> set @id=10;
QueryOK,0rows affected (0.00sec)
mysql> call pr_param_inout(@id);
?+------------+
| id_inner_1 |?
+------------+
|10|?
+------------+
1rowinset (0.00sec)?
+------------+
| id_inner_2 |?
+------------+
|11|?
+------------+
1rowinset (0.00sec)?
+------------+
| id_inner_3 |?
+------------+
|11|?
+------------+
1rowinset (0.01sec)QueryOK,0rows affected (0.01sec)
mysql> select @idasid_out;?
+--------+
| id_out |?
+--------+
|11|?
+--------+
1rowinset (0.00sec)
## 從結(jié)果可以看出:我們把 @id(10)傳給存儲過程后枢步,存儲過程最后又把計算結(jié)果值11(id_inner_3)
## 傳回給調(diào)用者沉删。MySQL存儲過程inout參數(shù)的行為跟C語言函數(shù)中的引用傳值類似。
=========================================================================================
通過以上例子:
1) ?如果僅僅想把數(shù)據(jù)傳給MySQL存儲過程醉途,那就用in類型參數(shù)矾瑰;
2) ?如果僅僅從MySQL存儲過程返回值,那就用out類型參數(shù)隘擎;
3) ?如果需要把數(shù)據(jù)傳給MySQL存儲過程經(jīng)過計算再傳回給我們殴穴,那就用inout類型參數(shù)。