この記事の制限は、すべてのストアドルーチン、つまりストアドプロシージャとストアド関数に適用されます。また、ストアド関数に特有の制限もあります。ストアド関数の制限はトリガーにも適用されますが、トリガーにはそれぞれ特有の制限もあります。
SQLステートメントの使用制限
ストアドプログラムにおけるSQLステートメントの使用制限は以下の通りです:
ストアドルーチンでは
LOAD DATAステートメントの使用は許可されません。SQLプリペアドステートメント(
PREPARE、EXECUTE、DEALLOCATE PREPARE)はストアドプロシージャで使用できますが、ストアド関数やトリガーでは使用できません。そのため、ストアド関数やトリガーでは動的SQLを使用できません。ストアドプログラムでも、SQLプリペアドステートメントで使用が制限されているステートメントの使用は許可されません。ただし、例外処理ステートメントである
SIGNAL、RESIGNAL、GET DIAGNOSTICSは除きます。これらはプリペアドステートメントとしては使用できませんが、ストアドプログラム内では使用できます。ローカル変数はストアドプログラムの実行期間中のみ有効であるため、ストアドプログラム内で作成されたプリペアドステートメントから参照することは許可されません。プリペアドステートメントは、存在するストアドプログラムではなく、現在のセッションに対してのみ有効です。そのため、変数が有効範囲外となったプログラム終了後にそのステートメントを実行することは可能です。
すべてのストアドプログラム(ストアドプロシージャ、関数、トリガー)において、パーサーは
BEGIN[WORK]をBEGIN。。。ENDブロックと見なします。このコンテキストでトランザクションを開始するには、START TRANSACTIONを使用してください。
ストアド関数の制限
ストアド関数では、以下の追加ステートメントや操作の使用は許可されません:
明示的または暗黙的なコミットまたはロールバックを実行するステートメント。SQL標準ではこれらのステートメントのサポートは必須ではなく、各DBMSベンダーが制限を設けるかどうかを独自に決定できると規定されています。
結果セットを返すステートメント。例えば、
INTO var_list句を含まないSELECTステートメントやSHOW、EXPLAIN、CHECK TABLEなどです。関数はSELECT INTO句を使用するか、カーソルとFETCHステートメントを使用して結果セットを処理できます。FLUSHステートメント。ストアド関数は再帰的に使用することはできません。
関数やトリガーを呼び出すステートメント(読み取りまたは書き込み用)に含まれるテーブルが存在する場合、そのストアド関数やトリガーではそのテーブルを変更できません。
上記の制限されたステートメントは、ストアドプロシージャ内で使用できますが、ストアド関数やトリガーから呼び出されるストアドプロシージャは除きます。例えば、ストアドプロシージャ内で FLUSH ステートメントを使用した場合、そのストアドプロシージャはストアド関数やトリガーから呼び出すことができません。
トリガーの制限
トリガーには以下の追加の制限があります:
外部キー操作はトリガーをアクティブにしません。
トリガーは値を返すことができないため、
RETURNステートメントの使用は許可されません。トリガーを即座に終了させたい場合は、LEAVEステートメントを使用してください。
ストアドルーチン内の名前衝突
ルーチンのパラメータ、ローカル変数、テーブルの列名は同じ識別子を使用でき、ネストされたブロック内でも同じローカル変数名を使用できます。このような識別子の曖昧さについては、以下の優先順位ルールに従います:
ローカル変数は、一般的にルーチンのパラメータやテーブルの列名よりも優先されます。
ルーチンのパラメータは、テーブルの列名よりも優先されます。
内部ブロック内のローカル変数は、外部ブロック内のローカル変数よりも優先されます。