MySQL 8.0 リファレンスマニュアル


13.2.1 CALL ステートメント

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「プリペアドステートメントおよびストアドプログラムのキャッシュ」を参照してください。


関連キーワード:  ステートメント, CREATE, TABLE, OUT, CALL, DROP, IN, パラメータ, サブクエリー, 関数