無料PHPプログラム

MySQL 5.1 リファレンスマニュアル :: 12 SQL ステートメント構文 :: 12.7 プリペアド ステートメントの為の SQL 構文
« 12.6.2.9 STOP SLAVE 構文

13 ストレージエンジンとテーブルタイプ »
Section Navigation      [Toggle]
  • 12 SQL ステートメント構文
  • 12.1 データ定義ステートメント
  • 12.2 データ取り扱いステートメント
  • 12.3 MySQL ユーティリティ ステートメント
  • 12.4 MySQL トランザクションとロッキング関連のステートメント
  • 12.5 データベース管理ステートメント
  • 12.6 複製ステートメント
  • 12.7 プリペアド ステートメントの為の SQL 構文

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

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 構文は、マルチ ステートメント(‘;’ 文字で分割される、単一文字列内の複数ステートメントの事)をサポートしません。

Copyright c 1997, 2010, Oracle and/or its affiliates. All rights reserved. Legal Notices
Top / Previous / Next / Up / Table of Contents
© 2010, Oracle Corporation and/or its affiliates

無料CGI PHPスクリプト | 新着情報スクリプト | 営業日カレンダー | PHPマニュアル | MySQLマニュアル | PEARマニュアル

Copyright (c) 2010 jmcodex.com All rights reserved.