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
        の値が含まれています。
      

