Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.1Mb
EPUB - 7.5Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


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() 関数を呼び出します。

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.5.3-m3-log |         11 |
+--------------+------------+

PREPARE および EXECUTE で使用される準備済み CALL ステートメントでは、IN パラメータにプレースホルダを使用できます。OUT および INOUT パラメータの場合、プレースホルダのサポートは MySQL 5.5.3 以降で使用できます。これらの種類のパラメータは、次のように使用できます。

mysql> SET @increment = 10;
mysql> PREPARE s FROM 'CALL p(?, ?)';
mysql> EXECUTE s USING @version, @increment;
mysql> SELECT @version, @increment;
+--------------+------------+
| @version     | @increment |
+--------------+------------+
| 5.5.3-m3-log |         11 |
+--------------+------------+

MySQL 5.5.3 より前は、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.5.0-m2-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 5.6 では、CLIENT_MULTI_RESULTS はデフォルトで有効にされています。

mysql_query() または mysql_real_query() を使用して実行された CALL ステートメントの結果を処理するには、それ以上結果が存在するかどうかを判定するために mysql_next_result() を呼び出すループを使用してください。例については、セクション23.8.17「複数ステートメント実行の C API サポート」を参照してください。

MySQL インタフェースを備える言語で記述されたプログラムの場合は、CALL ステートメントからの OUT または INOUT パラメータの結果を直接取得するためのネイティブメソッドが MySQL 5.5.3 より前には存在しません。これらのパラメータ値を取得するには、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 の値が含まれています。

MySQL 5.6 では、C プログラムは準備済みステートメントインタフェースを使用して CALL ステートメントを実行し、OUT および INOUT パラメータにアクセスできます。これは、それ以上結果が存在するかどうかを判定するために mysql_stmt_next_result() を呼び出すループを使用して CALL ステートメントの結果を処理することにより行われます。例については、セクション23.8.20「C API のプリペアド CALL ステートメントのサポート」を参照してください。MySQL インタフェースを備える言語は、準備済み CALL ステートメントを使用して、OUT および INOUT プロシージャーパラメータを直接取得できます。

MySQL 5.6.6 以降では、ストアドプログラムによって参照されるオブジェクトへのメタデータ変更が検出され、そのプログラムが次に実行されときに、影響を受けるステートメントの自動再解析が行われるようになります。詳細については、セクション8.9.4「プリペアドステートメントおよびストアドプログラムのキャッシュ」を参照してください。


User Comments
Sign Up Login You must be logged in to post a comment.