【MySQL】プロシージャの引数について

スポンサーリンク

プロシージャの引数についてまとめます。

プロシージャに引数を指定することで、WHERE句の条件に充てたり、プロシージャーの結果を取得できます。

基本的なプロシージャの作成方法は以下の記事をご覧ください。

 

引数定義方法

プロシージャ作成の際に名前の後ろに定義します。

CREATE PROCEDURE プロシージャ名(in 引数名 型,out 引数名 型)

「in」はプロシージャ側が受け取った引数を格納し、「out」はプロシージャの処理結果などを格納します。

「in」と「out」がセットでなくても問題ありません。

実際に作成

以下のように、引数「in_id」を受け取り、SELECT結果を「out_result」に格納するプロシージャを作成します。

PRIMARY KEYを指定していますの戻り値は1を想定しています。

ちなみに、「into out_result」はSELECT結果を「out_result」に格納することを意味します。

MariaDB [test2]> delimiter //
MariaDB [test2]>
MariaDB [test2]> CREATE PROCEDURE pro_test(in in_id int(11)
-> ,out out_result varchar(10))
-> BEGIN
->
-> SELECT count(*) into out_result FROM movies where id = in_id;
->
->
->
-> END
-> //
Query OK, 0 rows affected (0.01 sec)

MariaDB [test2]>
MariaDB [test2]> delimiter ;

指定カラムが複数の場合は「into out_result, out_result2」のようにカンマで複数格納できます。

呼び出し

では実際に呼び出してみます。

第一引数にはidを指定し、第二引数のOUTは受け取った結果を変数として利用するので先頭に「@」をつけてあげます。

MariaDB [test2]> call pro_test(1,@x);
Query OK, 1 row affected (0.00 sec)

戻り値の確認

select @x;」で確認ができます。

MariaDB [test2]> select @x;
+------+
| @x |
+------+
| 1 |
+------+
1 row in set (0.00 sec)

MariaDB [test2]>

inoutについて

引数について、「in」と「out」の他に「inout」があります。

「inout」は文字の通り、「in」と「out」を合わせたものです。つまり、受け取った変数を上書きすることが可能です。

以下のプロシージャを作成します。

渡したin_idでIDの数をカウントし、カウント結果をout_resultに格納し、さらにinout_statusでステータスを確認できます。

MariaDB [test2]> delimiter //
MariaDB [test2]>
MariaDB [test2]> CREATE PROCEDURE `pro_test`(in in_id int(11)
-> ,out out_result int(10)
-> ,inout inout_status varchar(10))
-> begin
->
-> select count(*) into out_result from movies where id = in_id;
->
-> if out_result >= 1 then
-> set inout_status = 'OK';
-> else
-> set inout_status = 'NG';
-> end if;
->
-> end//
Query OK, 0 rows affected (0.01 sec)

MariaDB [test2]> delimiter ;

実行してみます。

MariaDB [test2]> set @x = 0;
Query OK, 0 rows affected (0.00 sec)

MariaDB [test2]> set @y = 'status';
Query OK, 0 rows affected (0.00 sec)

MariaDB [test2]> call pro_test(1,@x,@y);
Query OK, 1 row affected (0.00 sec)

MariaDB [test2]> select @x,@y;
+------+------+
| @x | @y |
+------+------+
| 1 | OK |
+------+------+
1 row in set (0.00 sec)

MariaDB [test2]>

少し無理矢理な使い方ですが、ケースによってはうまく使えそうですね。

タイトルとURLをコピーしました