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