ストアドルーチンはプロシージャーまたは関数のどちらかです。ストアドルーチンは,创建过程
および创建函数
ステートメントで作成されます(セクション13.1.15“创建过程および创建函数構文”を参照してください)。プロシージャーは调用
ステートメントを使用して呼び出され(セクション13.2.1“叫構文”を参照してください),出力変数の使用でのみ値を戻すことができます。関数は,ほかの関数とまったく同様に(つまり,関数の名前を呼び出すことによって)ステートメント内部から呼び出すことができ,スカラー値を戻すことができます。ストアドルーチンの本体では,複合ステートメントを使用できます(セクション13.6”MySQL複合ステートメント構文”を参照してください)。
ストアドルーチンは,下降过程
および删除函数
ステートメントで削除でき(セクション13.1.26“DROP PROCEDUREおよび下降函数構文”を参照してください),改变的过程
および改变函数
ステートメントで変更できます(セクション13.1.5“改变程序構文”を参照してください)。
ストアドプロシージャーまたはストアドファンクションは,特定のデータベースに関連付けられています。これにはいくつかの問題があります。
ルーチンが呼び出されると,暗黙の
使用
が実行されます(その後,ルーチンが終了すると元に戻ります)。ストアドルーチン内でのdb_name
使用
ステートメントは許可されていません。データベース名でルーチン名を修飾できます。これは現在のデータベースに存在しないルーチンを参照する場合に使用できます。たとえば,
测试
データベースに関連するストアドプロシージャーp
またはストアドファンクションf
を呼び出すには,调用test.p ()
またはtest.f ()
と指定します。データベースを削除すると,そのデータベースに関連付けられたすべてのストアドルーチンも削除されます。
ストアドファンクションは再帰関数にはできません。
ストアドプロシージャーでの再帰は許可されていますが,デフォルトでは無効になっています。再帰を有効にするには,max_sp_recursion_depth
サーバーシステム変数を正の値に設定します。ストアドプロシージャーの再帰により,スレッドスタック領域の要求が増加します。max_sp_recursion_depth
の値を増やした場合,サーバー起動時にthread_stack
の値を増やすことによってスレッドスタックサイズを増やすことが必要な場合もあります。詳細は,セクション5.1.4”サーバーシステム変数”を参照してください。
MySQLでは,通常の选择
ステートメントをストアドプロシージャー内で(つまり,カーソルまたはローカル変数を使用せずに)使用できるようにする非常に役立つ拡張をサポートしています。このようなクエリーの結果セットは単にクライアントに直接送信されます。複数の选择
ステートメントは複数の結果セットを生成するので,クライアントは複数の結果セットをサポートしているMySQLクライアントライブラリを使用する必要があります。これは,クライアントが,4.1以降のMySQLのバージョンからクライアントライブラリを使用する必要があることを意味します。クライアントは,接続するときに,CLIENT_MULTI_RESULTS
オプションも指定する必要があります。Cプログラムの場合,これは,mysql_real_connect ()
C API関数で実行できます。セクション23.7.7.53”mysql_real_connect ()およびセクション23.7.17”複数ステートメント実行のC APIサポート”を参照してください。