CALL sp_name([parameter[,...]])
CALL sp_name[()]
CALL
ステートメントは、以前に CREATE PROCEDURE
を使用して定義されたストアドプロシージャーを呼び出します。
引数を取らないストアドプロシージャーは、括弧なしで呼び出すことができます。 つまり、CALL p()
と CALL p
は同等です。
CALL
は、OUT
または INOUT
パラメータとして宣言されたパラメータを使用して、その呼び出し元に値を返すことができます。 そのプロシージャーから戻るとき、クライアントプログラムは、ルーチン内で実行された最後のステートメントで影響を受けた行数を取得することもできます。SQL レベルでは、ROW_COUNT()
関数を呼び出します。C API からは、mysql_affected_rows()
関数を呼び出します。
プロシージャパラメータに対する未処理条件の影響の詳細は、セクション13.6.7.8「条件の処理と OUT または INOUT パラメータ」 を参照してください。
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 |
+--------------------+------------+
| 8.0.3-rc-debug-log | 11 |
+--------------------+------------+
PREPARE
および EXECUTE
で使用される準備済 CALL
ステートメントでは、IN
パラメータ、OUT
および INOUT
パラメータにプレースホルダを使用できます。 これらの種類のパラメータは、次のように使用できます。
mysql> SET @increment = 10;
mysql> PREPARE s FROM 'CALL p(?, ?)';
mysql> EXECUTE s USING @version, @increment;
mysql> SELECT @version, @increment;
+--------------------+------------+
| @version | @increment |
+--------------------+------------+
| 8.0.3-rc-debug-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
も有効になります) ことができます。 CLIENT_MULTI_RESULTS
はデフォルトで有効になっています。
mysql_query()
または mysql_real_query()
を使用して実行された CALL
ステートメントの結果を処理するには、それ以上結果が存在するかどうかを判定するために mysql_next_result()
を呼び出すループを使用してください。 例については、Multiple Statement Execution Supportを参照してください。
C プログラムでは、プリペアドステートメントインタフェースを使用して CALL
ステートメントを実行し、OUT
および INOUT
パラメータにアクセスできます。 これは、それ以上結果が存在するかどうかを判定するために mysql_stmt_next_result()
を呼び出すループを使用して CALL
ステートメントの結果を処理することにより行われます。 例については、Prepared CALL Statement Supportを参照してください。 MySQL インタフェースを備える言語は、準備済み CALL
ステートメントを使用して、OUT
および INOUT
プロシージャーパラメータを直接取得できます。
ストアドプログラムによって参照されるオブジェクトに対するメタデータの変更が検出され、プログラムが次に実行されるときに、影響を受けるステートメントが自動的に再解析されます。 詳細については、セクション8.10.3「プリペアドステートメントおよびストアドプログラムのキャッシュ」を参照してください。