int mysql_stmt_execute(MYSQL_STMT *stmt)
説明
mysql_stmt_execute()
はステートメントハンドルと関連付けられたプリペアドクエリーを実行します。現在バインドされているパラメータマーカー値がこの呼び出し中にサーバーに送信され、サーバーはそのマーカーをこの新しく提供されたデータと置き換えます。
mysql_stmt_execute()
のあとのステートメント処理は、ステートメントの種類によって異なります。
UPDATE
、DELETE
、またはINSERT
では、変更、削除、または挿入された行の数をmysql_stmt_affected_rows()
を呼び出して見つけることができます。-
結果セットを生成する
SELECT
などのステートメントでは、クエリー処理が発生するほかのすべての関数を呼び出す前に、mysql_stmt_fetch()
を呼び出して、データをフェッチする必要があります。結果をフェッチする方法の詳細については、セクション23.7.11.11「mysql_stmt_fetch()」を参照してください。mysql_stmt_execute()
の呼び出しに続いて、mysql_store_result()
またはmysql_use_result()
を呼び出さないでください。それらの関数は、プリペアドステートメントからの結果を処理することを意図していません。
結果セットを生成するステートメントに対して、mysql_stmt_execute()
に、ステートメントを実行する前に、mysql_stmt_attr_set()
を呼び出すことによって、ステートメントのカーソルを開くように要求できます。ステートメントを複数回実行する場合、mysql_stmt_execute()
は新しいカーソルを開く前に、開いているカーソルを閉じます。
プリペアドステートメントによって参照されているテーブルやビューのメタデータの変更が検出され、それが次に実行されるときに、ステートメントが自動再準備されます。詳細については、セクション8.9.4「プリペアドステートメントおよびストアドプログラムのキャッシュ」を参照してください。
戻り値
成功の場合はゼロ。エラーが発生した場合、ゼロ以外。
エラー
-
CR_COMMANDS_OUT_OF_SYNC
コマンドが正しくない順番で実行されました。
-
CR_OUT_OF_MEMORY
メモリー不足。
-
CR_SERVER_GONE_ERROR
MySQL サーバーが存在しなくなりました。
-
CR_SERVER_LOST
サーバーへの接続がクエリー中に失われました。
-
CR_UNKNOWN_ERROR
不明なエラーが発生しました。
例
次の例に、mysql_stmt_init()
、mysql_stmt_prepare()
、mysql_stmt_param_count()
、mysql_stmt_bind_param()
、mysql_stmt_execute()
、および mysql_stmt_affected_rows()
を使用して、テーブルを作成し、移入する方法を示します。mysql
変数は有効な接続ハンドルであるとみなされます。データの取得方法を示す例については、セクション23.7.11.11「mysql_stmt_fetch()」を参照してください。
#define STRING_SIZE 50
#define DROP_SAMPLE_TABLE "DROP TABLE IF EXISTS test_table"
#define CREATE_SAMPLE_TABLE "CREATE TABLE test_table(col1 INT,\
col2 VARCHAR(40),\
col3 SMALLINT,\
col4 TIMESTAMP)"
#define INSERT_SAMPLE "INSERT INTO \
test_table(col1,col2,col3) \
VALUES(?,?,?)"
MYSQL_STMT *stmt;
MYSQL_BIND bind[3];
my_ulonglong affected_rows;
int param_count;
short small_data;
int int_data;
char str_data[STRING_SIZE];
unsigned long str_length;
my_bool is_null;
if (mysql_query(mysql, DROP_SAMPLE_TABLE))
{
fprintf(stderr, " DROP TABLE failed\n");
fprintf(stderr, " %s\n", mysql_error(mysql));
exit(0);
}
if (mysql_query(mysql, CREATE_SAMPLE_TABLE))
{
fprintf(stderr, " CREATE TABLE failed\n");
fprintf(stderr, " %s\n", mysql_error(mysql));
exit(0);
}
/* Prepare an INSERT query with 3 parameters */
/* (the TIMESTAMP column is not named; the server */
/* sets it to the current date and time) */
stmt = mysql_stmt_init(mysql);
if (!stmt)
{
fprintf(stderr, " mysql_stmt_init(), out of memory\n");
exit(0);
}
if (mysql_stmt_prepare(stmt, INSERT_SAMPLE, strlen(INSERT_SAMPLE)))
{
fprintf(stderr, " mysql_stmt_prepare(), INSERT failed\n");
fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
exit(0);
}
fprintf(stdout, " prepare, INSERT successful\n");
/* Get the parameter count from the statement */
param_count= mysql_stmt_param_count(stmt);
fprintf(stdout, " total parameters in INSERT: %d\n", param_count);
if (param_count != 3) /* validate parameter count */
{
fprintf(stderr, " invalid parameter count returned by MySQL\n");
exit(0);
}
/* Bind the data for all 3 parameters */
memset(bind, 0, sizeof(bind));
/* INTEGER PARAM */
/* This is a number type, so there is no need
to specify buffer_length */
bind[0].buffer_type= MYSQL_TYPE_LONG;
bind[0].buffer= (char *)&int_data;
bind[0].is_null= 0;
bind[0].length= 0;
/* STRING PARAM */
bind[1].buffer_type= MYSQL_TYPE_STRING;
bind[1].buffer= (char *)str_data;
bind[1].buffer_length= STRING_SIZE;
bind[1].is_null= 0;
bind[1].length= &str_length;
/* SMALLINT PARAM */
bind[2].buffer_type= MYSQL_TYPE_SHORT;
bind[2].buffer= (char *)&small_data;
bind[2].is_null= &is_null;
bind[2].length= 0;
/* Bind the buffers */
if (mysql_stmt_bind_param(stmt, bind))
{
fprintf(stderr, " mysql_stmt_bind_param() failed\n");
fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
exit(0);
}
/* Specify the data values for the first row */
int_data= 10; /* integer */
strncpy(str_data, "MySQL", STRING_SIZE); /* string */
str_length= strlen(str_data);
/* INSERT SMALLINT data as NULL */
is_null= 1;
/* Execute the INSERT statement - 1*/
if (mysql_stmt_execute(stmt))
{
fprintf(stderr, " mysql_stmt_execute(), 1 failed\n");
fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
exit(0);
}
/* Get the number of affected rows */
affected_rows= mysql_stmt_affected_rows(stmt);
fprintf(stdout, " total affected rows(insert 1): %lu\n",
(unsigned long) affected_rows);
if (affected_rows != 1) /* validate affected rows */
{
fprintf(stderr, " invalid affected rows by MySQL\n");
exit(0);
}
/* Specify data values for second row,
then re-execute the statement */
int_data= 1000;
strncpy(str_data, "
The most popular Open Source database",
STRING_SIZE);
str_length= strlen(str_data);
small_data= 1000; /* smallint */
is_null= 0; /* reset */
/* Execute the INSERT statement - 2*/
if (mysql_stmt_execute(stmt))
{
fprintf(stderr, " mysql_stmt_execute, 2 failed\n");
fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
exit(0);
}
/* Get the total rows affected */
affected_rows= mysql_stmt_affected_rows(stmt);
fprintf(stdout, " total affected rows(insert 2): %lu\n",
(unsigned long) affected_rows);
if (affected_rows != 1) /* validate affected rows */
{
fprintf(stderr, " invalid affected rows by MySQL\n");
exit(0);
}
/* Close the statement */
if (mysql_stmt_close(stmt))
{
fprintf(stderr, " failed while closing the statement\n");
fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
exit(0);
}
プリペアドステートメント関数の使用の完全な例については、ファイル tests/mysql_client_test.c
を参照してください。このファイルは MySQL ソース配布または Bazaar ソースリポジトリから取得できます。