MySQLストアド・プロシージャ・パラメータには、in、out、inoutの3種類があります.それぞれどんな役割と特徴がありますか?


一、MySQLストレージプロセスパラメータ(in)
MySQLストアド・プロシージャ「in」パラメータ:C言語の関数パラメータの値伝達と同様に、MySQLストアド・プロシージャ内でこのパラメータが変更される可能性がありますが、inタイプのパラメータの変更は、呼び出し元(caller)には表示されません(not visible).
drop procedure if exists pr_param_in;

create procedure pr_param_in
(
   in id int -- in     MySQL       
)
begin
   if (id is not null) then
      set id = id + 1;
   end if;

   select id as id_inner;
end;
set @id = 10;
call pr_param_in(@id);
select @id as id_out;
mysql> call pr_param_in(@id);
+----------+
| id_inner |
+----------+
|       11 |
+----------+

mysql> select @id as id_out;
+--------+
| id_out |
+--------+
| 10     |
+--------+

ユーザ変数@idの入力値は10であり、ストレージ・プロシージャを実行した後、プロシージャの内部値は:11(id_inner)であるが、外部変数の値は依然として:10(id_out)であることがわかる.
二、MySQLストレージプロセスパラメータ(out)
MySQLストアド・プロシージャ「out」パラメータ:ストアド・プロシージャの内部から呼び出し元に値を渡します.ストレージ・プロシージャの内部では、呼び出し元がストレージ・プロシージャ・パラメータに値を設定するかどうかにかかわらず、パラメータの初期値はnullです.
drop procedure if exists pr_param_out;

create procedure pr_param_out
(
   out id int
)
begin
   select id as id_inner_1;  -- id      null

   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;
set @id = 10;

call pr_param_out(@id);

select @id as id_out;
mysql> set @id = 10;
mysql>
mysql> call pr_param_out(@id);
+------------+
| id_inner_1 |
+------------+
|       NULL |
+------------+

+------------+
| id_inner_3 |
+------------+
|          1 |
+------------+

mysql> select @id as id_out;
+--------+
| id_out |
+--------+
| 1      |
+--------+

ユーザ定義変数@idが10に設定されているが、@idがストレージプロセスに渡された後、ストレージプロセス内部でidの初期値は常にnull(id_inner_1)である.最後にid値(id_out=1)が呼び出し者に返される.
三、MySQLストレージプロセスパラメータ(inout)
MySQLストアド・プロシージャinoutパラメータはoutと同様に、ストアド・プロシージャ内部から呼び出し元に値を渡すことができます.異なる点は、呼び出し元はinoutパラメータを介してストレージ・プロシージャに値を渡すこともできます.
drop procedure if exists pr_param_inout;

create procedure pr_param_inout
(
   inout id int
)
begin
   select id as id_inner_1;  -- id           

   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;
set @id = 10;

call pr_param_inout(@id);

select @id as id_out;
mysql> set @id = 10;
mysql>
mysql> call pr_param_inout(@id);
+------------+
| id_inner_1 |
+------------+
|         10 |
+------------+

+------------+
| id_inner_2 |
+------------+
|         11 |
+------------+

+------------+
| id_inner_3 |
+------------+
|         11 |
+------------+
mysql>
mysql> select @id as id_out;
+--------+
| id_out |
+--------+
| 11     |
+--------+

結果から,@id(10)をストアド・プロシージャに渡すと,ストアド・プロシージャは最後に計算結果値11(id_inner_3)を呼び出し元に返す.SQL Myストアド・プロシージャinoutパラメータの挙動はC言語関数における参照伝達値と類似している.
以上の例では、MySQLストレージ・プロシージャにデータを渡すだけであれば、「
in」タイプパラメータ;MySQLストレージ・プロシージャからのみ値を返す場合は、「
outタイプパラメータ;MySQLストレージ・プロシージャにデータを転送する必要がある場合は、計算後に転送する必要があります.この場合は、「
inoutタイプパラメータ.