プリペアド ステートメントの為の SQL 構文

MySQL 5.1 はサーバ サイドのプリペアド ステートメントへのサポートを提供します。妥当なクライアント プログラムインターフェースを利用するという条件で、このサポートは MySQL 4.1 内でインプリメントされた有効なクライアント/サーバ バイナリ プロトコルを駆使します。インターフェース候補は、MySQL C API クライアント ライブラリ(C プログラムの為の物)、MySQL コネクタ/J(プログラムの為の物)、そして MySQL コネクタ/NET です。例えば、C API はそのプリペアド ステートメント API を構成する関数呼び出しのセットを提供します。詳しくは 項 「準備されたC APIステートメント。」 を参照してください。別の言語インターフェースは、バイナリ プロトコルを C クライアント ライブラリ内でリンクさせて利用するプリペアド ステートメントのサポートを提供する事ができます。その1つの例が、PHP 5.0 以降で有効な、mysqli extension です。

プリペアド ステートメントの代替 SQL インターフェースが有効です。このインターフェースはプリペアド ステートメント API にバイナリ プロトコルを利用する事ほど有効では有りませんが、これは SQL レベルで直接有効なのでプログラミングを必要としません。

プリペアド ステートメントの SQL 構文は、次のような場合に利用する為の物です。

プリペアド ステートメントの SQL 構文が3つの SQL ステートメントに基づいている。

次の SQL ステートメントはプリペアド ステートメント内で利用できます。CREATE TABLEDELETEDOINSERTREPLACESELECTSETUPDATE、そしてほとんどの SHOW ステートメント。

MySQL 5.1.10 以降、次の追加ステートメントがサポートされています。

ANALYZE TABLE
OPTIMIZE TABLE
REPAIR TABLE

MySQL 5.1.12 以降、次の追加ステートメントがサポートされています。

CACHE INDEX
CHANGE MASTER
CHECKSUM {TABLE | TABLES}
{CREATE | RENAME | DROP} DATABASE
{CREATE | RENAME | DROP} USER
FLUSH {TABLE | TABLES | TABLES WITH READ LOCK | HOSTS | PRIVILEGES
  | LOGS | STATUS | MASTER | SLAVE | DES_KEY_FILE | USER_RESOURCES}
GRANT
REVOKE
KILL
LOAD INDEX INTO CACHE
RESET {MASTER | SLAVE | QUERY CACHE}
SHOW BINLOG EVENTS
SHOW CREATE {PROCEDURE | FUNCTION | EVENT | TABLE | VIEW}
SHOW {AUTHORS | CONTRIBUTORS | WARNINGS | ERRORS}
SHOW {MASTER | BINARY} LOGS
SHOW {MASTER | SLAVE} STATUS
SLAVE {START | STOP}
INSTALL PLUGIN
UNINSTALL PLUGIN

その他のステートメントはまだサポートされていません。

次の例は、2辺の長さが分かっている3角形の斜辺を算出するステートメントを準備する為の、2つの同等な方法を表しています。

最初の例は、ステートメントのテキストを提供する為に、文字列直定数を利用してプリペアド ステートメントを作成する方法を表しています。

mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> SET @a = 3;
mysql> SET @b = 4;
mysql> EXECUTE stmt1 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|          5 |
+------------+
mysql> DEALLOCATE PREPARE stmt1;

2つ目の例も似ていますが、ステートメントのテキストをユーザ変数として提供しています。

mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> PREPARE stmt2 FROM @s;
mysql> SET @a = 6;
mysql> SET @b = 8;
mysql> EXECUTE stmt2 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|         10 |
+------------+
mysql> DEALLOCATE PREPARE stmt2;

プレースホルダは、プリペアド ステートメントを利用する時に LIMIT 条項の引数に対して利用できます。詳しくは 項 「SELECT 構文」 を参照してください。

プリペアド ステートメントの SQL 構文は、ネスト化された種類の中では利用できません。これは、PREPARE にパスしたステートメント自体は PREPAREEXECUTE、または DEALLOCATE PREPARE ステートメントになり得ないという事です。

プリペアド ステートメントの SQL 構文は、プリペアド ステートメント API コールを利用する事とは違います。例えば、PREPAREEXECUTE、または DEALLOCATE PREPARE ステートメントを準備する為に mysql_stmt_prepare() C API 関数を利用する事はできません。

プリペアド ステートメントの SQL 構文はストアド プロシージャ内で利用できますが、ストアド ファンクションやトリガ内では利用できません。

プリペアド ステートメントの SQL 構文は、マルチ ステートメント(‘;’ 文字で分割される、単一文字列内の複数ステートメントの事)をサポートしません。