CALLステートメント構文

CALL sp_name([parameter[,...]])
CALL sp_name[()]

CALLステートメントによって、CREATE PROCEDURE.を使用して以前に定義したプロシージャが起動されます。

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

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

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

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;

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

mysql> SET @increment = 10;
mysql> CALL p(@version, @increment);
mysql> SELECT @version, @increment;
+-----------------+------------+
| @version        | @increment |
+-----------------+------------+
| 5.1.12-beta-log | 11         | 
+-----------------+------------+

CALLSQLステートメントを使用するCプログラムを書き込んで、結果セットを生成させるストアドプロシージャを実行する場合、ユーザはmysql_real_connect()を呼び出す時、CLIENT_MULTI_STATEMENTSをセットすることによって、CLIENT_MULTI_RESULTSフラグを明確または暗黙にセットする要があります。このようなストアドプロシージャはそれぞれ、複数の結果を生成します。プロシージャ内で実行されたステートメントによって返された結果のセット、並びに呼び出しのステータスを示す結果。CALLステートメントの結果を処理するには、mysql_next_result()を呼び出すループを使用してさらに多くの結果があるか特定してください。(例については、項 「マルチプルステートメントを実行するC APIハンドリング」を参照してください。)

MySQLインターフェースを提供する言語で書かれたプログラムに対して、OUTパラメータやINOUTパラメータの結果をCALLステートメントから直接複製するネイティブ方法は存在しません。パラメータ値を取得するには、CALLステートメント中のプロシージャに、ユーザが規定した変数を渡し、その後、SELECTステートメントを実行して、変数値を含む結果セットを生成させてください。以下の例は、2つのOUTパラメータを含むストアドプロシージャ p1に対するテクニック(エラーチェックを除く)を例示したものです。

mysql_query(mysql, "CALL p1(@param1, @param2)");
mysql_query(mysql, "SELECT @param1, @param2");
result = mysql_store_result(mysql);
row = mysql_fetch_row(result);
mysql_free_result(result);

先行するコードを実行した後、row[0]並びにrow[1]に、@param1および@param2の値をそれぞれ含ませます。

INOUTパラメータを扱う為に、ユーザ変数をその値にセットしてプロシージャに渡すCALLの前に、ステートメントを実行してください。