MySQLストアド・プロシージャ・パラメータには、in、out、inoutの3種類があります.それぞれどんな役割と特徴がありますか?
一、MySQLストレージプロセスパラメータ(in)
MySQLストアド・プロシージャ「in」パラメータ:C言語の関数パラメータの値伝達と同様に、MySQLストアド・プロシージャ内でこのパラメータが変更される可能性がありますが、inタイプのパラメータの変更は、呼び出し元(caller)には表示されません(not visible).
ユーザ変数@idの入力値は10であり、ストレージ・プロシージャを実行した後、プロシージャの内部値は:11(id_inner)であるが、外部変数の値は依然として:10(id_out)であることがわかる.
二、MySQLストレージプロセスパラメータ(out)
MySQLストアド・プロシージャ「out」パラメータ:ストアド・プロシージャの内部から呼び出し元に値を渡します.ストレージ・プロシージャの内部では、呼び出し元がストレージ・プロシージャ・パラメータに値を設定するかどうかにかかわらず、パラメータの初期値はnullです.
ユーザ定義変数@idが10に設定されているが、@idがストレージプロセスに渡された後、ストレージプロセス内部でidの初期値は常にnull(id_inner_1)である.最後にid値(id_out=1)が呼び出し者に返される.
三、MySQLストレージプロセスパラメータ(inout)
MySQLストアド・プロシージャinoutパラメータはoutと同様に、ストアド・プロシージャ内部から呼び出し元に値を渡すことができます.異なる点は、呼び出し元はinoutパラメータを介してストレージ・プロシージャに値を渡すこともできます.
結果から,@id(10)をストアド・プロシージャに渡すと,ストアド・プロシージャは最後に計算結果値11(id_inner_3)を呼び出し元に返す.SQL Myストアド・プロシージャinoutパラメータの挙動はC言語関数における参照伝達値と類似している.
以上の例では、MySQLストレージ・プロシージャにデータを渡すだけであれば、「
in」タイプパラメータ;MySQLストレージ・プロシージャからのみ値を返す場合は、「
outタイプパラメータ;MySQLストレージ・プロシージャにデータを転送する必要がある場合は、計算後に転送する必要があります.この場合は、「
inoutタイプパラメータ.
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タイプパラメータ.