CALLsp_name
([parameter
[,...]]) CALLsp_name
[()]
CALL
ステートメントは、以前に
CREATE PROCEDURE
を使用して定義されたストアドプロシージャーを呼び出します。
MySQL 5.1.13
では、引数を取らないストアドプロシージャーは括弧なしで呼び出すことができます。すなわち、CALL
p()
と CALL p
は等価です。
CALL
は、OUT
または
INOUT
パラメータであると宣言されているパラメータを使って、値を発信側に返すことができます。プロシージャーから戻るとき、クライアントプログラムは、ルーチン内で実行された最後のステートメントで影響を受けた行数も取得できます。SQL
レベルでは、ROW_COUNT()
関数を呼び出します。C API
からは、mysql_affected_rows()
関数を呼び出します。
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.32-log | 11 | +------------+------------+
PREPARE
および
EXECUTE
とともに使用される
CALL
準備済みステートメントの場合、プレースホルダは
MySQL 5.1 では
IN
パラメータに対して使用できますが、OUT
または INOUT
パラメータに対しては使用できません。OUT
および INOUT
パラメータに対するこの制限を回避するために、プレースホルダの使用は避けてください。代わりに、ユーザー変数を
CALL
ステートメント自体で参照し、EXECUTE
ステートメントでは指定しないでください。
mysql>SET @increment = 10;
mysql>PREPARE s FROM 'CALL p(@version, @increment)';
mysql>EXECUTE s;
mysql>SELECT @version, @increment;
+------------+------------+ | @version | @increment | +------------+------------+ | 5.1.32-log | 11 | +------------+------------+
CALL
SQL
ステートメントを使用して、結果セットを生成するストアドプロシージャーを実行する
C
プログラムを記述するには、CLIENT_MULTI_RESULTS
フラグが有効になっている必要があります。これは、各
CALL
によって、プロシージャー内で実行されるステートメントによって返される可能性のある結果セットに加えて、呼び出しステータスを示すための結果が返されるためです。CLIENT_MULTI_RESULTS
はまた、CALL
が、準備済みステートメントを含む任意のストアドプロシージャーを実行するために使用される場合にも有効になっている必要があります。このようなプロシージャーがいつロードされるかや、これらのステートメントによって結果セットが生成されるかどうかを特定することはできないため、これらを前提にすることが必要です。
CLIENT_MULTI_RESULTS
は
mysql_real_connect()
を呼び出すときに、CLIENT_MULTI_RESULTS
フラグ自体を引き渡すことによって明示的に、または
CLIENT_MULTI_STATEMENTS
(これによっても
CLIENT_MULTI_RESULTS
が有効になる)
を引き渡すことによって暗黙的に有効にすることができます。
mysql_query()
または
mysql_real_query()
を介して実行された
CALL
ステートメントの結果を処理するには、ループを使用して
mysql_next_result()
を呼び出し、結果が残っているかどうかを判定します。(例については、C API Support for Multiple Statement Executionを参照してください)。
MySQL
インタフェースを提供する言語で書かれたプログラムに対して、OUT
パラメータや INOUT
パラメータの結果を
CALL
ステートメントから直接複製するネイティブ方法は存在しません。パラメータ値を取得するには、CALL
ステートメント中のプロシージャーに、ユーザーが規定した変数を渡し、その後、SELECT
ステートメントを実行して、変数値を含む結果セットを生成させてください。INOUT
パラメータを処理するには、CALL
の前に、対応するユーザー変数を、プロシージャーに渡される値に設定するステートメントを実行します。
次の例は、先に説明した、OUT
パラメータと INOUT
パラメータを含むストアドプロシージャー
p
の手法
(エラーチェックはなし) を示しています。
mysql_query(mysql, "SET @increment = 10"); mysql_query(mysql, "CALL p(@version, @increment)"); mysql_query(mysql, "SELECT @version, @increment"); result = mysql_store_result(mysql); row = mysql_fetch_row(result); mysql_free_result(result);
前のコードが実行されたあと、row[0]
と row[1]
にはそれぞれ、@version
と @increment
の値が含まれています。