準備されたステートメントの処理に利用可能な機能の概要をここで一括説明し、後のセクションで各機能について詳細に説明します。項23.2.7. 「準備されたC APIステートメント機能の詳細」を参照してください。
機能 | 説明 |
mysql_stmt_affected_rows() | 準備されたUPDATE 、DELETE 、またはINSERT
ステートメントの行変更、消去、もしくは挿入の回数を返す。 |
mysql_stmt_attr_get() | 準備されたステートメントの属性値を入手する。 |
mysql_stmt_attr_set() | 準備されたステートメントの属性をセットする。 |
mysql_stmt_bind_param() | 準備されたSQLステートメントのパラメータマーカとアプリケーションデータバッファを関連させる。 |
mysql_stmt_bind_result() | 結果セットのカラムとアプリケーションデータバッファを関連させる。 |
mysql_stmt_close() | 準備されたステートメントに使用されているメモリを開放する。 |
mysql_stmt_data_seek() | ステートメント結果セットの任意の行ナンバーをシークする。 |
mysql_stmt_errno() | 最後に実行されたステートメントに対してエラーナンバーを返す。 |
mysql_stmt_error() | 最後に実行されたステートメントに対してエラーメッセージを返す。 |
mysql_stmt_execute() | 準備されたステートメントを実行する。 |
mysql_stmt_fetch() | 結果セットから次のデータの行を入手し、全ての束縛されたカラムのデータを返す。 |
mysql_stmt_fetch_column() | 結果セットの現在の行の1カラムからデータを入手する。 |
mysql_stmt_field_count() | 最近のステートメントの結果カラムの数を返す。 |
mysql_stmt_free_result() | ステートメントハンドルに割り当てられたリソースを開放する。 |
mysql_stmt_init() |
MYSQL_STMT
構成のためのメモリを確保し、初期化する。 |
mysql_stmt_insert_id() | 準備されたプログラムに夜AUTO_INCREMENT
カラム用に生成されたIDを返す。 |
mysql_stmt_num_rows() | ステートメントのバッファされた結果セットからトータル行を返す。 |
mysql_stmt_param_count() | 準備されたSQLステートメント内のパラメータの数を返す。 |
mysql_stmt_param_metadata() | (結果セットの形でパラメータメタデータを返す。)現在、この機能は何もしません。 |
mysql_stmt_prepare() | は実行のため、SQLストリングを用意します。 |
mysql_stmt_reset() | Reset the statement buffers in the server. |
mysql_stmt_result_metadata() | Returns prepared statement metadata in the form of a result set. |
mysql_stmt_row_seek() | Seeks to a row offset in a statement result set, using value returned
from mysql_stmt_row_tell() . |
mysql_stmt_row_tell() | Returns the statement row cursor position. |
mysql_stmt_send_long_data() | Sends long data in chunks to server. |
mysql_stmt_sqlstate() | Returns the SQLSTATE error code for the last statement execution. |
mysql_stmt_store_result() | Retrieves the complete result set to the client. |
ステートメントハンドルを作成するにはmysql_stmt_init()
を呼び出してください。準備するにはmysql_stmt_prepare
を呼び出してください。パラメータデータを提供するにはmysql_stmt_bind_param()
を呼び出してください。ステートメントを実行するにはmysql_stmt_execute()
を呼び出してください。mysql_stmt_bind_param()
を通して供給された各バッファー中のパラメータを変更することによって、mysql_stmt_execute()
を繰り返すことができます。.
ステートメントがSELECT
または結果セットを生成するその他のステートメントである場合、mysql_stmt_prepare()
は、MYSQL_RES
結果セットのフォームの中に、mysql_stmt_result_metadata()
を通して、結果セットメタデータ情報も戻します。
mysql_stmt_bind_result()
を使って、結果バッファーを供給することができるのので、mysql_stmt_fetch()
は自動的にデータをこれらのバッファーに戻します。これが列別フェッチングです。
シャンク中のエキストまたはバイナリーデータをmysql_stmt_send_long_data()
を使ってサーバに送ることもできます。項23.2.7.25. 「mysql_stmt_data_seek()
」を参照してください。
ステートメントの実行が終わったとき、それをmysql_stmt_close()
を使って閉じなければならないので、それに付属する全ての資源を解放することができます。
mysql_stmt_result_metadata()
を呼び出すことによって、SELECT
ステートメントの結果セットメタデータを取得した場合、mysql_free_result()
を使ってメタデータも解放すべきです。
実行ステップ
ステートメントをを準備して実行するために、アプリケーションはこれらのステップに従います:
mysql_stmt_init()
を使って準備されたステートメントのハンドルを生成させてください。サーバ上にステートメントを準備するため、mysql_stmt_prepare()
を呼び出して、それをSQLステートメントを含むストリングに渡してください。
ステートメントが結果セットを生成する場合、mysql_stmt_result_metadata()
を呼び出して、結果セットメタデータを取得してください。このメタデータは、クエリーによって戻された列を含むものとは違いますが、結果セット中に含まれています。メタデータ結果セットは、カラムが結果中に幾つ存在しているかを示し、各カラムに関する情報を含んでいます。
mysql_stmt_bind_param()
を使って、パラメータの値をセットしてください。すべてのパラメータをセットしなければなりません。さもなければ、ステートメントがエラーを戻すか、意外な結果を引き起こします。
mysql_stmt_execute()
を呼び出してステートメントを実行してください。
ステートメントが結果セットを生成する場合、メタデータバッファーを結束して、mysql_stmt_bind_result()
を呼び出すことによって、列の値を復元するために使ってください。
繰り返しmysql_stmt_fetch()
を呼び出すことによって、列が見つからなくなるまで、データを列ごとにバッファーの中にフェッチしてください。
パラメータの値を変えてステートメントを再実行することによって、必要に応じて3回から6回ステップを繰り返し実行してください。
mysql_stmt_prepare()
が呼び出されるとき、MySQLクライアント/サーバプロトコルはこれらのアクションを実施します。
サーバはステートメントを解析し、ステートメントにIDを割り当てることによって、Okのステータスをクライアントに送り返します。それが結果セットを指向したステートメントである場合、サーバはパラメータの合計ナンバー、カラムカウントおよびそのメタデータも送ります。ステートメントのすべてのsyntaxとsemanticsがこの呼び出し中に、サーバによってチェックされます。
クライアントは、そのステートメントを、ステートメントプールにあるその他のステートメントと区別することができるように、このステートメントのIDを更なるオペレーションに使います。
mysql_stmt_execute()
が呼び出されるとき、MySQLクライアント/サーバプロトコルはこれらのアクションを実施します。
クライアントはステートメントハンドルを使って、サーバーにパラメータデータを送ります。
サーバは、クライアントが提供したIDを使ってステートメントを識別し、パラメータ・マーカーを使って新しく供給されたデータと入れ替えて、ステートメントを実行します。ステートメントが結果セットを生成する場合、サーバーはクライアントにデータを送り返します。さもなければ、それは変更、削除または挿入されたOkステータスと列の合計数を送ります。
mysql_stmt_fetch()
が呼び出されるとき、MySQLクライアント/サーバプロトコルはこれらのアクションを実施します。
クライアントは列別にパケット列からデータを読み取って、それを必要な変換をすることによって、アプリケーションデータバッファの中に置きます。アプリケーションバッファタイプが、サーバーからタイプが戻されたフィールドのそれと同じであると、変換は簡単です。
エラーが発生した場合、mysql_stmt_errno()
、mysql_stmt_error()
およびmysql_stmt_sqlstate()
を繰り返し使って、ステートメントエラーコード、エラーメッセージ並びにSQLSTATE値を
を得ることができます。
準備されたステートメントのロギング
mysql_stmt_prepare()
と
mysql_stmt_execute()
C API
ファンクションで準備されたステートメントに対して、サーバは準備
そして実行
ラインを一般クエリログに送信します。これによりステートメントがいつ準備、実行されたかわかります。
次のようにステートメントを準備して実行すると考えてください:
mysql_stmt_prepare()
を呼び出してステートメントストリング"SELECT
?"
を用意します。
mysql_stmt_bind_param()
を呼び出して、値3
を準備されたステートメント中のパラメータに結びつけます。
mysql_stmt_execute()
を呼び出して準備されたステートメントを実行してください。
前のコールの結果として、サーバーは一般クエリーログに次の行を書き込みます:
Prepare [1] SELECT ? Execute [1] SELECT 3
ログ内の各準備
と実行
ラインは、[
ステートメント識別子でタグされます。これはどの準備されたステートメントがログしているか確認するためです。N
]N
は正の整数です。複数の準備されたステートメントがクライアントに対して同時にアクテブである場合、N
を1より大きくすることができます。各Execute
ラインは、?
パラメータのためにデータ値を取り替えた後の準備されたステートメントを示します。
バージョンの注意:準備
ラインは、[
なしで、MySQL
4.1.10前は表示されます。N
]実行
ラインはMySQL 4.1.10前では表示されません。