10bet网址
MySQL5.6版本リファレンスマニュアル
下载本手册

13.2.1呼叫構文

呼叫sp\ U名称([参数[,…]])呼叫sp\ U名称[()]

呼叫ステートメントは、以前に创建过程を使用して定義されたストアドプロシージャーを呼び出します。

引数を取らないストアドプロシージャーは、括弧なしで呼び出すことができます。つまり、呼叫p()呼叫pは同等です。

呼叫は、出来または伊努特パラメータとして宣言されたパラメータを使用して、その呼び出し元に値を返すことができます。そのプロシージャーから戻るとき、クライアントプログラムは、ルーチン内で実行された最後のステートメントで影響を受けた行数を取得することもできます。SQL语句レベルでは、行计数()関数を呼び出します。C原料药からは、mysql\u受影响的\u行()関数を呼び出します。

出来または伊努特パラメータを使用してプロシージャーから値を取得するには、ユーザー変数を使用してこのパラメータを渡し、そのプロシージャーから戻ったあとに変数の値をチェックします。(そのプロシージャーを別のストアドプロシージャーまたはストアドファンクション内から呼び出している場合は、在里面または伊努特パラメータとしてルーチンパラメータまたはローカルルーチン変数を渡すこともできます。)伊努特パラメータの場合は、プロシージャーに渡す前にその値を初期化してください。次のプロシージャーには、このプロシージャーが現在のサーバーバージョンに設定する出来パラメータと、このプロシージャーがその現在の値から 1.増分する伊努特値が含まれています。

创建过程p(OUT ver\u param VARCHAR(25),INOUT incr\u param INT)BEGIN#Set value of OUT parameter SELECT VERSION()INTO ver\u param;#INOUT参数集增量值incr\u param=incr\u param+1;结束;

このプロシージャーを呼び出す前に、伊努特パラメータとして渡される変数を初期化します。このプロシージャーを呼び出したあと、これらの 2.つの変数の値は設定または変更されています。

mysql>设置@increment=10;mysql>调用p(@version,@increment);mysql>选择@version,@increment;+------------+------------+\@版本|@增量|+----------------+-----------+| 5.5.3-m3-log | 11 |+--------------+------------+

准备および执行で使用される準備済み呼叫ステートメントでは、在里面パラメータにプレースホルダを使用できます。出来および伊努特パラメータの場合、プレースホルダのサポートは MySQL5.5.3版本以降で使用できます。これらの種類のパラメータは、次のように使用できます。

mysql>设置@increment=10;mysql>PREPARE s FROM'CALL p(??)';mysql>使用@version,@increment执行s;mysql>选择@version,@increment;+------------+------------+\@版本|@增量|+----------------+-----------+| 5.5.3-m3-log | 11 |+--------------+------------+

MySQL5.5.3版本より前は、出来または伊努特パラメータにプレースホルダのサポートは使用できません。出来および伊努特パラメータに対するこの制限を回避するために、プレースホルダの使用は避けてください。代わりに、ユーザー変数を呼叫ステートメント自体で参照し、执行ステートメントでは指定しないでください。

mysql>设置@increment=10;mysql>PREPARE s FROM'CALL p(@version,@increment)';mysql>执行s;mysql>选择@version,@increment;+------------+------------+\@版本|@增量|+----------------+-----------+| 5.5.0-m2-log | 11 |+--------------+------------+

呼叫SQL语句ステートメントを使用して、結果セットを生成するストアドプロシージャーを実行する Cプログラムを記述するには、客户端\u多\u结果フラグが有効になっている必要があります。これは、各呼叫によって、プロシージャー内で実行されるステートメントによって返される可能性のある結果セットに加えて、呼び出しステータスを示すための結果が返されるためです。客户端\u多\u结果は、呼叫が、準備済みステートメントを含むストアドプロシージャーを実行するために使用される場合にも有効になっている必要があります。このようなプロシージャーがいつロードされるかや、これらのステートメントによって結果セットが生成されるかどうかを特定することはできないため、これらを想定する必要があります。

客户端\u多\u结果は、mysql\u real\u connect()を呼び出すときに、客户端\u多\u结果フラグ自体を渡すことによって明示的に、または客户多对账单を渡すことによって暗黙的に有効にする (これによって客户端\u多\u结果も有効になります) ことができます。MySQL5.6版本では、客户端\u多\u结果はデフォルトで有効にされています。

mysql\u query()またはmysql\u real\u query()を使用して実行された呼叫ステートメントの結果を処理するには、それ以上結果が存在するかどうかを判定するためにmysql\u next\u result()を呼び出すループを使用してください。例については、セクション23.7.17「複数ステートメント実行の C原料药サポート」を参照してください。

MySQL数据库インタフェースを備える言語で記述されたプログラムの場合は、呼叫ステートメントからの出来または伊努特パラメータの結果を直接取得するためのネイティブメソッドが MySQL5.5.3版本より前には存在しません。これらのパラメータ値を取得するには、呼叫ステートメントでプロシージャーにユーザー定義変数を渡したあと、选择ステートメントを実行して変数値を含む結果セットを生成してください。伊努特パラメータを処理するには、呼叫の前に、対応するユーザー変数を、プロシージャーに渡される値に設定するステートメントを実行してください。

次の例は、先に説明した、出来パラメータと伊努特パラメータを含むストアドプロシージャーPの手法 (エラーチェックはなし) を示しています。

mysql\u query(mysql,“SET@increment=10”);mysql_query(mysql,“CALL p(@version,@increment)”);mysql\u query(mysql,“SELECT@version,@increment”);result=mysql\u store\u result(mysql);row=mysql\u fetch\u row(结果);mysql\u free\u result(结果);

前のコードが実行されたあと、行[0]第[1]行にはそれぞれ、@版本@增量の値が含まれています。

MySQL5.6版本では、Cプログラムは準備済みステートメントインタフェースを使用して呼叫ステートメントを実行し、出来および伊努特パラメータにアクセスできます。これは、それ以上結果が存在するかどうかを判定するためにmysql\u stmt\u next\u result()を呼び出すループを使用して呼叫ステートメントの結果を処理することにより行われます。例については、セクション23.7.20「C APIのプリペアド 呼叫ステートメントのサポート」を参照してください。MySQL数据库インタフェースを備える言語は、準備済み呼叫ステートメントを使用して、出来および伊努特プロシージャーパラメータを直接取得できます。

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