MySQL 5.1 はサーバ サイドのプリペアド
ステートメントへのサポートを提供します。妥当なクライアント
プログラムインターフェースを利用するという条件で、このサポートは
MySQL 4.1
内でインプリメントされた有効なクライアント/サーバ
バイナリ
プロトコルを駆使します。インターフェース候補は、MySQL
C API クライアント ライブラリ(C
プログラムの為の物)、MySQL
コネクタ/J(プログラムの為の物)、そして MySQL
コネクタ/NET です。例えば、C API
はそのプリペアド ステートメント API
を構成する関数呼び出しのセットを提供します。詳しくは
項23.2.4. 「準備されたC APIステートメント。」
を参照してください。別の言語インターフェースは、バイナリ
プロトコルを C クライアント
ライブラリ内でリンクさせて利用するプリペアド
ステートメントのサポートを提供する事ができます。その1つの例が、PHP
5.0
以降で有効な、mysqli
extension です。
プリペアド ステートメントの代替 SQL インターフェースが有効です。このインターフェースはプリペアド ステートメント API にバイナリ プロトコルを利用する事ほど有効では有りませんが、これは SQL レベルで直接有効なのでプログラミングを必要としません。
有効なプログラミング インターフェースが無い時にこれを利用する事ができます。
mysql クライアント プログラムのように、実行されるサーバに SQL ステートメントを送る事を許容する全てのプログラムからこれを利用する事ができます。
もしクライアントが古いバージョンのクライアント ライブラリを利用していてもこれを利用する事ができます。たった1つ要求される事は、プリペアド ステートメントの SQL 構文をサポートするのに充分新しいサーバに接続できなければいけないという事です。
プリペアド ステートメントの SQL 構文は、次のような場合に利用する為の物です。
プリペアド ステートメントが、それをコード化する前に自分のアプリケーション内でどのように機能するかをテストしたい。
アプリケーションが、プリペアド ステートメントを実行するに当たり問題が発生し、何が原因なのかを調査したい。
バグ リポートをファイルする為に、プリペアド ステートメントについて起きている問題を説明するテスト ケースを作成したい。
プリペアド ステートメントを利用したいが、それらをサポートするプログラム API へのアクセスが無い。
プリペアド ステートメントの SQL 構文が3つの SQL ステートメントに基づいている。
PREPARE
stmt_name
FROM
preparable_stmt
PREPARE
ステートメントはステートメントを準備し、後でそのステートメントを参照する物によって、名前
stmt_name
を割り当てます。ステートメント名は大文字と小文字を区別しません。
preparable_stmt
は文字列直定数、またはステートメントのテキストを含むユーザ変数です。テキストは複数ステートメントではなく、単一
SQL
ステートメントを表さなければいけません。ステートメント内で
‘?
’
文字は、後でクエリを実行する時にデータ値がクエリのどこに結合されるかを指示するパラメータ
メーカとして利用されます。‘?
’
文字は、それらを文字列値に結合したいとしても、引用符で囲んではいけません。パラメータ
メーカは、SQL
キーワードや識別子等ではなく、データ値が現れるところでのみ利用する事ができます。
もし与えられた名前を持つプリペアド ステートメントが既に存在したら、新しいステートメントが準備される前にそれは暗黙的に割り当て解除されます。これは、もし新しいステートメントがエラーを含み準備できないとしたらエラーは返され、与えられた名前のステートメントは存在しない、という意味です。
プリペアド ステートメントの範囲は、それが作成される範囲内のクライアント セッションです。他のクライアントはそれを見る事ができません。
EXECUTE
stmt_name
[USING
@var_name
[,
@var_name
] ...]
ステートメントを準備した後、プリペアド
ステートメント名を参照する
EXECUTE
ステートメントを利用してそれを実行します。もしプリペアド
ステートメントがパラメータ
メーカを含んでいたら、パラメータに結合される値を含むユーザ変数をリストする
USING
条項を提供する必要があります。パラメータ値はユーザ変数のみで提供でき、USING
条項はステートメント内のパラメータ
メーカ数と全く同数の変数に名前をつける必要があります。
各実行の前に、与えられたプリペアド ステートメントを複数回実行し、それに異なる変数を与え、また変数を異なる値に設定する事ができます。
{DEALLOCATE | DROP} PREPARE
stmt_name
プリペアド
ステートメントの割り当てを解除するには、DEALLOCATE
PREPARE
ステートメントを利用してください。割り当て解除した後にプリペアド
ステートメントを実行しようとするとエラーが発生します。
もし以前のプリペアド ステートメントの割り当て解除をしないでクライアント セッションを終了しようとすると、サーバがそれを自動的に割り当て解除します。
次の SQL ステートメントはプリペアド
ステートメント内で利用できます。CREATE
TABLE
、DELETE
、DO
、INSERT
、REPLACE
、SELECT
、SET
、UPDATE
、そしてほとんどの
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
条項の引数に対して利用できます。詳しくは
項12.2.7. 「SELECT
構文」 を参照してください。
プリペアド ステートメントの SQL
構文は、ネスト化された種類の中では利用できません。これは、PREPARE
にパスしたステートメント自体は
PREPARE
、EXECUTE
、または
DEALLOCATE PREPARE
ステートメントになり得ないという事です。
プリペアド ステートメントの SQL
構文は、プリペアド ステートメント API
コールを利用する事とは違います。例えば、PREPARE
、EXECUTE
、または
DEALLOCATE PREPARE
ステートメントを準備する為に
mysql_stmt_prepare()
C API
関数を利用する事はできません。
プリペアド ステートメントの SQL 構文はストアド プロシージャ内で利用できますが、ストアド ファンクションやトリガ内では利用できません。
プリペアド ステートメントの SQL 構文は、マルチ
ステートメント(‘;
’
文字で分割される、単一文字列内の複数ステートメントの事)をサポートしません。