MySQL存儲(chǔ)過程中的IN,OUT,INOUT類型

MySQL存儲(chǔ)過程中有IN,OUT,INOUT類型

-----------------------------------

## IN ? IN參數(shù)只用來(lái)向過程傳遞信息,為默認(rèn)值。

## MySQL存儲(chǔ)過程"in"參數(shù):跟C語(yǔ)言的函數(shù)參數(shù)的值傳遞類似,MySQL存儲(chǔ)過程內(nèi)部可能會(huì)修改此參數(shù),

## 但in類型參數(shù)的修改對(duì)調(diào)用者(caller)來(lái)說(shuō)是不可見的(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í)行存儲(chǔ)過程后,在過程內(nèi)部值為:11(id_inner),

## ?但外部變量值依舊為:10(id_out)

==================================================================================

## OUT ? OUT參數(shù)只用來(lái)從過程傳回信息。

## MySQL存儲(chǔ)過程"out"參數(shù):從存儲(chǔ)過程內(nèi)部傳值給調(diào)用者。

## 在存儲(chǔ)過程內(nèi)部,該參數(shù)初始值為 null,無(wú)論調(diào)用者是否給存儲(chǔ)過程參數(shù)設(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)

## 可以看出,雖然我們?cè)O(shè)置了用戶定義變量@id為10,傳遞@id給存儲(chǔ)過程后,在存儲(chǔ)過程內(nèi)部,

## id的初始值總是 null(id_inner_1)。最后id值(id_out=1)傳回給調(diào)用者。

===================================================================================

## INOUT INOUT參數(shù)可以向過程傳遞信息,如果值改變,則可再?gòu)倪^程外調(diào)用。

## MySQL存儲(chǔ)過程"inout"參數(shù)跟out類似,都可以從存儲(chǔ)過程內(nèi)部傳值給調(diào)用者。

## 不同的是:調(diào)用者還可以通過inout參數(shù)傳遞至給存儲(chǔ)過程。

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)傳給存儲(chǔ)過程后,存儲(chǔ)過程最后又把計(jì)算結(jié)果值11(id_inner_3)

## 傳回給調(diào)用者。MySQL存儲(chǔ)過程inout參數(shù)的行為跟C語(yǔ)言函數(shù)中的引用傳值類似。

=========================================================================================

通過以上例子:

1) ?如果僅僅想把數(shù)據(jù)傳給MySQL存儲(chǔ)過程,那就用in類型參數(shù);

2) ?如果僅僅從MySQL存儲(chǔ)過程返回值,那就用out類型參數(shù);

3) ?如果需要把數(shù)據(jù)傳給MySQL存儲(chǔ)過程經(jīng)過計(jì)算再傳回給我們,那就用inout類型參數(shù)。

原文地址:http://blog.sina.com.cn/s/blog_6238358c0100n7ss.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,641評(píng)論 18 399
  • 任務(wù)需求:定時(shí)執(zhí)行的任務(wù),調(diào)用存儲(chǔ)過程,進(jìn)行數(shù)據(jù)遷移。 存儲(chǔ)過程相關(guān)總結(jié):(存儲(chǔ)過程的創(chuàng)建 不能伴隨有if exi...
    時(shí)待吾閱讀 3,206評(píng)論 0 4
  • 轉(zhuǎn)載自這里 存儲(chǔ)過程簡(jiǎn)介 我們常用的操作數(shù)據(jù)庫(kù)語(yǔ)言SQL語(yǔ)句在執(zhí)行的時(shí)候需要要先編譯,然后執(zhí)行,而存儲(chǔ)過程(Sto...
    杜七閱讀 2,468評(píng)論 4 27
  • 原文鏈接 MySQL存儲(chǔ)過程詳解 1.存儲(chǔ)過程簡(jiǎn)介 我們常用的操作數(shù)據(jù)庫(kù)語(yǔ)言SQL語(yǔ)句在執(zhí)行的時(shí)候需要要先編譯,然...
    亞斯咪妮閱讀 2,723評(píng)論 1 30
  • article 一個(gè)故事告訴你比特幣的原理及運(yùn)作機(jī)制 The Proof-of-Work Concept 比特幣白...
    dyun閱讀 512評(píng)論 0 2

友情鏈接更多精彩內(nèi)容