ここに記載されている規制のうちには、すべてのストアド ルーチン、つまりストアド プロシージャとストアド ファンクションの両方に適用するものがあります。またあるものは、ストアド ファンクションのみにあてはまり、ストアド プロシージャには関係しません。
ストアド ファンクションに適用されるすべての規制は、トリガにもあてはまります。
ストアド ルーチンは、任意の SQL 文を取り込むことはできません。次のステートメントは利用不可です:
固定文 LOCK TABLES
、UNLOCK
TABLES
。
LOAD DATA
および LOAD
TABLE
。
SQL プリペアド ステートメント
(PREPARE
、EXECUTE
、DEALLOCATE
PREPARE
)。解説 : ストアド ルーチン内
(ステートメントをストリングとして動的に構築し、実行する場
) で動的 SQL を使うことはできない。
この規制は MySQL 5.0.13 からストアド
プロシージャに適用され、引き続きストアド
ファンクションおよびトリガにも用いられる。
ストアド ファンクションでは、次の予備のステートメントまたは操作が不許可になっています ( ストアド プロシージャには適合しない ):
明示的もしくは暗黙の遂行、またはロールバックを行うステートメント。
結果セットを返すステートメント。これには
INTO
句を持たない var_list
SELECT
文と、SHOW
文が含まれる。関数は SELECT ... INTO
または、カーソルと var_list
FETCH
文を使って結果セットを処理することができる。項17.2.7.3. 「SELECT ... INTO
ステートメント」
参照。
FLUSH
ステートメント
再帰的ステートメント。ストアド ファンクションを再帰的に使用することはできない。
ストアド ファンクションまたはトリガ内では、その関数やトリガを実行したステートメントが ( 読み取り、または書込みに ) すでに使用しているテーブルを改変することはできない。
規制のあるものは通常、ストアド
ファンクションとトリガに適用されるがストアド
プロシージャには当てはまらないということになっていますが、ストアド
ファンクション内またはトリガ内から実行されたストアド
プロシージャには、それらの規制が適用されますので注意してください。例えば、FLUSH
をストアド
プロシージャで使用することはできますが、そうしたストアド
プロシージャをストアド
ファンクションやトリガから呼び出すことができません。
ルーチン パラメータ、ローカル変数、テーブル カラムに同じ識別子を使用することは可能です。また、同じローカル変数名を入れ子になったブロックで使うこともできます。例 :
CREATE PROCEDURE p (i INT) BEGIN DECLARE i INT DEFAULT 0; SELECT i FROM t; BEGIN DECLARE i INT DEFAULT 1; SELECT i FROM t; END; END;
その場合、識別子が曖昧になるため、次の優先順位ルールが適用されます :
ローカル変数は、ルーチン パラメータもしくはテーブル カラムより優先される。
ルーチン パラメーターをテーブル カラムより優先。
内側ブロックのローカル変数を、外側ブロックのローカル変数より優先。
テーブル カラムが変数より優先されないという場合、その挙動は標準のものではありません。
ストアド ルーチンの使用は、反復の問題の原因になる場合があります。この問題については 項17.4. 「ストアドルーチンとトリガのバイナリログ」 で詳しく述べられています。
INFORMATION_SCHEMA
スキーマは
PARAMETERS
テーブルをまだ持っていませんので、ランタイムでルーチン
パラメータ情報を得る必要のあるアプリケーションは、SHOW
CREATE
文のアウトプットを構文解析するなどの回避策を取らなければなりません。
ストアド ルーチンのデバッグ機能は存在しません。
CALL
文を準備することはできません。これはサーバ側のプリペアド
ステートメントでも、SQL プリペアド
ステートメントでも同じです。
UNDO
ハンドラはサポートされていません。
FOR
ループはサポートされていません。
サーバ スレッド間の作業の問題を防ぐため、クライアントがステートメントを発行する際、サーバはステートメントの実行に利用できるルーチンとトリガのスナップショットを使用します。これは、ステートメントの実行の間に使用される可能性のあるプロシージャ、関数、トリガのリストを算出してロードし、そしてステートメントの実行に進むということです。これにより、ステートメントが実行される間、他のスレッドが実行するルーチンに変化がないということになります。
RENAME DATABASE
文が、ストアド
ルーチンを新たなスキーマ名に変えることはありません。
項12.1.18. 「RENAME DATABASE
構文」 参照。
トリガには、次の予備のステートメントまたは操作が利用不可になっています :
トリガは現在、外部キーのアクションでは起動されない。
RETURN
文は、値を返すことのできないトリガでは利用不可。すぐさまトリガから出るには、LEAVE
文を使用する。
mysql
データベースのテーブルではトリガを使用できない。
MySQL Cluster のストアド ルーチンおよびトリガ.
ストアド ファンクション、ストアド
プロシージャ、およびトリガはすべて、NDB
保存エンジンを使用したテープルにサポートされていますが、それらは
MySQL サーバ間に Cluster SQL
ノードとして自動的に伝播しないということを忘れないでください。その原因は次になります
:
ストアド
ルーチンの定義は、MyISAM
保存エンジンを使用して、mysql
システム
データベース内のテーブルに保管されます。
トリガの定義を含む .TRN
および .TRG
ファイルを、NDB
保存エンジンが読み取ることはなく、また
Cluster ノード間でのコピーもされません。
MySQL Cluster
テーブルに作用するすべてのストアド
ルーチンまたはトリガは、そのストアド
ルーチンまたはトリガを使用したいクラスタに関与する各
MySQL サーバの、適切な CREATE
PROCEDURE
、CREATE FUNCTION
、または CREATE TRIGGER
文を実行することによって再作成されなければなりません。同様に、既存のストアド
ルーチンまたはトリガのいかなる変更も、クラスタにアクセスする各
MySQL Server の適切な ALTER
または
DROP
文を使用して、すべての
Cluster SQL
ノードで明示的に実行される必要があります。
NDB
保存エンジンを使用するために、mysql
データベース
テーブルを変換して、上の最初の項で説明のあった問題を回避しようと試みるのはやめてください。mysql
データベースのシステム
テーブルを変更すると希望しない結果を引き起こす可能性が高く、MySQL
AB では支持していません。