CALLsp_name
([parameter
[,...]]) CALLsp_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 | +-----------------+------------+
CALL
SQLステートメントを使用するCプログラムを書き込んで、結果セットを生成させるストアドプロシージャを実行する場合、ユーザはmysql_real_connect()
を呼び出す時、CLIENT_MULTI_STATEMENTS
をセットすることによって、CLIENT_MULTI_RESULTS
フラグを明確または暗黙にセットする要があります。このようなストアドプロシージャはそれぞれ、複数の結果を生成します。プロシージャ内で実行されたステートメントによって返された結果のセット、並びに呼び出しのステータスを示す結果。CALL
ステートメントの結果を処理するには、mysql_next_result()
を呼び出すループを使用してさらに多くの結果があるか特定してください。(例については、項23.2.9. 「マルチプルステートメントを実行する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
の前に、ステートメントを実行してください。