mysql_execute()


int mysql_execute(MYSQL_STMT *stmt).

Descrição

mysql_execute() executa a consulta preparada associada ao controlador de instruções. O valor atual do marcador de parâmetros é enviado para o servidor durante esta chamada, e o servidor substituir marcadores com os novos dados fornecidos.

Se a instrução é um UPDATE, DELETE ou INSERT, o número total de registros altrados, deletados ou inseridos pode ser encontrado chamando mysql_stmt_affected_rows(). Se este é um resultado de uma consulta como SELECT, deve se chamar mysql_fetch() para buscar dados previamente para fazer qualquer outra função que resulte em um processamento de consulta. Para mais informações sobre como buscar os resultados, consulte "mysql_fetch()"

Valor Retornado

Zero se a execução obteve sicesso. Diferente de zero se ocorreu um erro. O código de erro e a mensagem podem ser obtidas chamando mysql_stmt_errno() e mysql_stmt_error().

Erros

Exemplo

O seguinte exemplo demonstra como criar e preencher uma tabela usando mysql_prepare(), mysql_param_count(), mysql_bind_param(), mysql_execute() e mysql_stmt_affected_rows(). A variável MariaDB é considerada como um controlador de conexão válido.

#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; it will */
/* be set to the current date and time) */
stmt = mysql_prepare(mysql, INSERT_SAMPLE, strlen(INSERT_SAMPLE));
if (!stmt)
{
 fprintf(stderr, ' mysql_prepare(), INSERT failed\n');
 fprintf(stderr, ' %s\n', mysql_error(mysql));
 exit(0);
}
fprintf(stdout, ' prepare, INSERT successful\n');
/* Get the parameter count from the statement */
param_count= mysql_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 */
/* 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_bind_param(stmt, bind))
{
 fprintf(stderr, ' mysql_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_execute(stmt))
{
 fprintf(stderr, ' mysql_execute(), 1 failed\n');
 fprintf(stderr, ' %s\n', mysql_stmt_error(stmt));
 exit(0);
}
/* Get the total number of affected rows */
affected_rows= mysql_stmt_affected_rows(stmt);
fprintf(stdout, ' total affected rows(insert 1): %ld\n', 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_execute(stmt))
{
 fprintf(stderr, ' mysql_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): %ld\n', 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);
}

Nota: Para exemplos completos do uso das funções de instruções preparadas, veja tests/mysql_client_test.c. Este arquivo pode ser obtido em uma distribuição fonte ou do repositório do Bitkeeper.

Retornar