MySQL 5.1.13では現在、アーギュメントを取り込んでいないストアドプロシージャに、
かっことをつけることなく取り出すことができるようになっています。即ち、CALL p()とCALL pは等価です。

CALLは、OUTまたは INOUTパラメータであると宣言されているパラメータを使って、
値を発信側に返すことができます。またこれはROW_COUNT() ファンクションをコールする事で
クライアントプログラムがSQLレベルで取得する事ができ、またmysql_affected_rows() C API 機能を
コールする事によって Cから取得する事ができる、影響を受けた行を「返します」。

OUTまたはINOUTパラメータを使って、値をプロシージャから戻すには、パラメータを、
ユーザ変数を使って渡し、プロシージャが戻した後、変数の値をチェックします。
ユーザが保存された他のプロシージャの中からプロシージャまたはファンクションを呼び出す場合、
ユーザはルーチンパラメータまたはローカルルーチン変数を、INパラメータまたはINOUTパラメータ
として渡すことができます。INOUTパラメータの場合、それをプロシージャに渡す前に値を初期化してください。
以下のプロシージャには、そのプロシージャがサーバの現バージョンにセットするOUT パラメータ
およびそのプロシージャがその現在値から1だけ増やすINOUT値が含まれています。


delimiter //
CREATE PROCEDURE p (OUT ver_param VARCHAR(25), INOUT incr_param INT)
BEGIN
# Set value of OUT parameter
SELECT VERSION() INTO ver_param;
# Increment value of INOUT parameter
SET incr_param = incr_param + 1;
END;
//
delimiter ;
SET @increment = 10;
CALL p(@version, @increment);
SELECT @version, @increment;

mysql> SET @increment = 11;
Query OK, 0 rows affected (0.00 sec)
mysql> CALL p(@version, @increment);
Query OK, 0 rows affected (0.01 sec)
mysql> SELECT @version, @increment;
+——————-+——————-+
| @version | @increment |
+——————-+——————-+
| 5.1.40-log | 12 |
+——————-+——————-+
1 row in set (0.00 sec)
mysql>

procedure_inout

プロシージャを呼び出す前に、INOUTパラメータとして渡すべき変数を初期化してください。
プロシージャを呼び出した後には、2つの変数はセットまたは更新されています。

# Increment value of INOUT parameter
SET incr_param = incr_param + 1;

初期化しないと以下のように値がincrementされて行きます。
procedure_inout_increment

以下のPROCEDUREは、UNTIL コンディションがTRUEにならない為、無限LOOPになります。

SET i = i + 1;
UNTIL i > 9

procedure_out1

正しくは、iの値を最初に設定してあげる必要があるので、
CREATE PROCEDURE incrementor (OUT i INT) 
では無く、INOUTを利用して
CREATE PROCEDURE incrementor (INOUT i INT)
にしてあげる必要があります。
————– DECLARE value INT default 0; の値をincrementorにINして+1した値を返す———–

procedure_inout_ok

Comments are closed.

Post Navigation