int mysql_stmt_execute(MYSQL_STMT *stmt)
Beschreibung
mysql_stmt_execute()
führt die
vorbereitete Anfrage aus, die zu dem Anweisungs-Handle
gehört. Die aktuellen Werte der gebundenen Parametermarker
werden bei diesem Aufruf an den Server geschickt, und der
Server ersetzt die Marker durch die frisch gelieferten Daten.
Wenn die Anweisung ein UPDATE
,
DELETE
oder INSERT
ist,
erfahren Sie durch einen Aufruf von
mysql_stmt_affected_rows()
, wie viele
Zeilen geändert, gelöscht oder eingefügt wurden. Ist es
eine Anweisung wie SELECT
, die eine
Ergebnismenge generiert, müssen Sie zuerst mit
mysql_stmt_fetch()
die Daten abholen, bevor
Sie irgendwelche Funktionen aufrufen, um die Anfrage zu
verarbeiten. Weitere Informationen über den Abruf von
Ergebnissen finden Sie in Abschnitt 24.2.7.11, „mysql_stmt_fetch()
“.
Für Anweisungen, die eine Ergebnismenge generieren, können
Sie verlangen, dass mysql_stmt_execute()
einen Cursor öffnet, indem Sie vor Ausführung der Anweisung
mysql_stmt_attr_set()
aufrufen. Wenn Sie
eine Anweisung mehrmals ausführen, schließt
mysql_stmt_execute()
einen eventuell noch
offenen Cursor, ehe es einen neuen öffnet.
Rückgabewerte
Null, wenn die Ausführung Erfolg hatte. Ein von null verschiedener Wert, wenn ein Fehler auftrat.
Fehler
CR_COMMANDS_OUT_OF_SYNC
Befehle wurden in der falschen Reihenfolge ausgeführt.
CR_OUT_OF_MEMORY
Speicherüberlauf.
CR_SERVER_GONE_ERROR
Der MySQL Server ist nicht mehr verfügbar.
CR_SERVER_LOST
Die Serververbindung brach während der Anfrage ab.
CR_UNKNOWN_ERROR
Ein unbekannter Fehler ist aufgetreten.
Beispiel
Das folgende Beispiel zeigt, wie eine Tabelle mithilfe von
mysql_stmt_init()
,
mysql_stmt_prepare()
,
mysql_stmt_param_count()
,
mysql_stmt_bind_param()
,
mysql_stmt_execute()
und
mysql_stmt_affected_rows()
angelegt und mit
Daten gefüllt wird. Die mysql
-Variable sei
ein gültiger Verbindungs-Handle.
#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); } /* Bereite eine INSERT-Anfrage mit 3 Parametern vor */ /* (Die TIMESTAMP-Spalte ist nicht benannt; der Server */ /* stellt sie auf das aktuelle Datum und die Uhrzeit ein.) */ 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"); /* Hole die Zahl der Parameter aus der Anweisung */ param_count= mysql_stmt_param_count(stmt); fprintf(stdout, " total parameters in INSERT: %d\n", param_count); if (param_count != 3) /* Validiere Parameterzahl */ { fprintf(stderr, " invalid parameter count returned by MySQL\n"); exit(0); } /* Binde die Daten für alle 3 Parameter */ memset(bind, 0, sizeof(bind)); /* INTEGER PARAM */ /* Da dies ein Zahlentyp ist, muss buffer_length nicht angegeben werden */ 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; /* Binde die Puffer */ 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); } /* Gib Datenwerte für die erste Zeile an */ int_data= 10; /* Integer */ strncpy(str_data, "MySQL", STRING_SIZE); /* String */ str_length= strlen(str_data); /* INSERT SMALLINT-Daten als NULL */ is_null= 1; /* Führe die INSERT-Anweisung aus - 1*/ if (mysql_stmt_execute(stmt)) { fprintf(stderr, " mysql_stmt_execute(), 1 failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } /* Hole Gesamtzahl der betroffenen Zeilen */ affected_rows= mysql_stmt_affected_rows(stmt); fprintf(stdout, " total affected rows(insert 1): %lu\n", (unsigned long) affected_rows); if (affected_rows != 1) /* validiere betroffene Zeilen */ { fprintf(stderr, " invalid affected rows by MySQL\n"); exit(0); } /* Gib Datenwerte für zweite Zeile an und führe Anweisung erneut aus */ 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; /* Zurücksetzen */ /* Führe die INSERT-Anweisung aus - 2*/ if (mysql_stmt_execute(stmt)) { fprintf(stderr, " mysql_stmt_execute, 2 failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } /* Hole Gesamtzahl der betroffenen Zeilen */ affected_rows= mysql_stmt_affected_rows(stmt); fprintf(stdout, " total affected rows(insert 2): %lu\n", (unsigned long) affected_rows); if (affected_rows != 1) /* validiere betroffene Zeilen */ { fprintf(stderr, " invalid affected rows by MySQL\n"); exit(0); } /* Schließe die Anweisung */ if (mysql_stmt_close(stmt)) { fprintf(stderr, " failed while closing the statement\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); }
Hinweis: Vollständigere
Beispiele für die Nutzung von Funktionen für vorbereitete
Anweisungen finden Sie in der Datei
tests/mysql_client_test.c
. Diese liegt in
der MySQL-Quelldistribution und im BitKeeper-Quellarchiv.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.