本記事の制限は、すべてのストアドプログラム、つまりストアドプロシージャとストアド関数に適用されます。また、ストアド関数に特有の制限もありますが、ストアドプロシージャにはない制限もあります。ストアド関数の制限はトリガーにも適用されますが、トリガーには独自の制限もあります。
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ステートメントを使用してください。
ストレージルーチン内の名前衝突
ルーチンのパラメータ、ローカル変数、およびテーブルの列名は同じ識別子を使用でき、ネストされたブロック内でも同じローカル変数名を使用できます。このような識別子の曖昧さについては、以下の優先順位ルールに従います:
ローカル変数は、一般的にルーチンのパラメータやテーブルの列名よりも優先されます。
ルーチンのパラメータは、テーブルの列名よりも優先されます。
内部ブロック内のローカル変数は、外部ブロック内のローカル変数よりも優先されます。