MySQL 5.1 unterstützt serverseitige vorbereitete
Anweisungen. Diese Unterstützung nutzt das effiziente binäre
Client/Server-Protokoll, welches in MySQL 4.1 implementiert wurde.
Voraussetzung hierfür ist, dass Sie eine geeignete
Client-Programmierschnittstelle verwenden. Geeignete
Schnittstellen sind die C-API-Clientbibliothek von MySQL (für
C-Programme), MySQL Connector/J (für Java-Programme) und MySQL
Connector/NET. So bietet etwa die C-API eine Anzahl von
Funktionsaufrufen, die eine API für vorbereitete Anweisungen
darstellen. Siehe auch
Abschnitt 24.2.4, „C-API: Prepared Statements“. Andere
Sprachschnittstellen bieten Unterstützung für vorbereitete
Anweisungen, die das binäre Protokoll verwenden, indem Sie eine
Verbindung in die C-Clientbibliothek herstellen (z. B. die
mysqli
-Erweiterung
in PHP 5.0).
Es gibt auch eine alternative SQL-Schnittstelle für vorbereitete Anweisungen. Diese ist zwar nicht so effizient wie die Verwendung eines binären Protokolls über eine API für vorbereitete Anweisungen, sie erfordert aber auch keine Programmierung, weil sie direkt auf SQL-Ebene verfügbar ist:
Sie können sie verwenden, wenn Ihnen keine Programmierschnittstelle zur Verfügung steht.
Sie können sie aus jedem Programm heraus verwenden, das Ihnen die Übermittlung von SQL-Anweisungen an den Server zur dortigen Ausführung gestattet (dies gilt beispielsweise für das mysql-Clientprogramm).
Sie können es auch dann verwenden, wenn der Client eine alte Version der Clientbibliothek einsetzt. Die einzige Voraussetzung besteht darin, dass Sie eine Verbindung mit einem Server herstellen können müssen, der aktuell genug ist, um die SQL-Syntax für vorbereitete Anweisungen zu unterstützen.
Die SQL-Syntax für vorbereitete Anweisungen ist zur Verwendung in Fällen wie den folgenden vorgesehen:
Sie wollen die Funktion vorbereiteter Anweisungen in Ihrer Anwendung testen, bevor Sie sie einkodieren.
Eine Anwendung hat Probleme mit der Ausführung vorbereiteter Anweisungen, und Sie wollen dem Problem interaktiv auf den Grund gehen.
Sie wollen einen Testfall erstellen, der ein Problem im Zusammenhang mit vorbereiteten Anweisungen beschreibt. Dieser soll als Grundlage eines Fehlerberichts dienen.
Sie müssen vorbereitete Anweisungen verwenden, haben aber keinen Zugang zu einer Programmierschnittstelle, die diese unterstützt.
Die SQL-Syntax für vorbereitete Anweisungen basiert auf drei SQL-Anweisungen:
PREPARE
stmt_name
FROM
preparable_stmt
Die Anweisung PREPARE
bereitet eine
Anweisung vor und weist ihr den Namen
stmt_name
zu, unter dem sie später
referenziert werden kann. Die Groß-/Kleinschreibung wird bei
Anweisungsnamen nicht unterschieden.
preparable_stmt
ist entweder ein
String-Literal oder eine Benutzervariable, die den Text der
Anweisung enthält. Der Text muss eine einzelne SQL-Anweisung
(nicht mehrere Anweisungen) darstellen. In dieser Anweisung
können Fragezeichen (‘?
’) als
Parameterkennzeichen verwendet werden: Sie geben an, wo bei
der späteren Ausführung der Anweisung Datenwerte eingebunden
werden. Fragezeichen sollten auch dann nicht in
Anführungszeichen gesetzt werden, wenn Sie beabsichtigen, sie
an String-Werte anzubinden. Parameterkennzeichen dürfen nur
an Stellen verwendet werden, an denen Datenwerte eingefügt
werden sollen, nicht jedoch für SQL-Schlüsselwörter,
Bezeichner usw.
Wenn eine vorbereitete Anweisung des angegebenen Namens bereits vorhanden ist, wird diese Namenszuweisung implizit aufgehoben, bevor die neue Anweisung vorbereitet wird. Das bedeutet, dass, wenn die neue Anweisung einen Fehler enthält und nicht vorbereitet werden kann, ein Fehler zurückgegeben wird; in diesem Fall gibt es keine Anweisung des betreffenden Namens mehr.
Der Gültigkeitsbereich einer vorbereiteten Anweisung ist die Clientsitzung, innerhalb derer sie erstellt wird. Andere Clients sehen sie nicht.
EXECUTE
stmt_name
[USING
@var_name
[,
@var_name
] ...]
Nach der Vorbereitung einer Anweisung können Sie sie mit
einer EXECUTE
-Anweisung ausführen, die den
Namen der vorbereiteten Anweisung referenziert. Wenn die
vorbereitete Anweisung Parameterkennzeichen enthält, müssen
Sie eine USING
-Klausel angeben, die die
Benutzervariablen mit den Werten auflistet, welche für die
Parameter eingesetzt werden sollen. Parameterwerte können nur
über Benutzervariablen übergeben werden. Die
USING
-Klausel muss so viele Variablen
übergeben, wie Parameterkennzeichen in der Anweisung
vorhanden sind, und alle Variablennamen müssen korrekt sein.
Sie können eine vorbereitete Anweisung mehrfach ausführen und dabei unterschiedliche Variablen übergeben oder die Variablen vor jeder Ausführung auf andere Werte setzen.
{DEALLOCATE | DROP} PREPARE
stmt_name
Um eine vorbereitete Anweisung aufzuheben, verwenden Sie die
Anweisung DEALLOCATE PREPARE
. Wenn Sie eine
vorbereitete Anweisung auszuführen versuchen, nachdem Sie sie
aufgehoben haben, wird ein Fehler erzeugt.
Wenn Sie eine Clientsitzung beenden, ohne eine zuvor vorbereitete Anweisung aufzuheben, dann hebt der Server sie automatisch auf.
In vorbereiteten Anweisungen können die folgenden SQL-Anweisungen
verwendet werden: CREATE TABLE
,
DELETE
, DO
,
INSERT
, REPLACE
,
SELECT
, SET
,
UPDATE
und die meisten
SHOW
-Anweisungen. Andere Anweisungen werden
noch nicht unterstützt.
Die folgenden Beispiele zeigen zwei gleichwertige Arten der Vorbereitung einer Anweisung, die die Hypotenuse eines Dreiecks berechnet, bei dem zwei Seitenlängen gegeben sind.
Das erste Beispiel zeigt, wie man eine vorbereitete Anweisung unter Verwendung eines String-Literals erstellt, um den Text der Anweisung zu übergeben:
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;
Das zweite Beispiel ist ähnlich, übergibt den Text der Anweisung aber als Benutzervariable:
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;
Die SQL-Syntax für vorbereitete Anweisungen erlaubt keine
Verschachtelungen: Eine an PREPARE
übergebene
Anweisung darf selbst keine PREPARE
-,
EXECUTE
- oder DEALLOCATE
PREPARE
-Anweisung sein.
Die SQL-Syntax für vorbereitete Anweisungen unterscheidet sich
von der Verwendung von API-Aufrufen für vorbereitete Anweisungen.
So können Sie beispielsweise mit der C-API-Funktion
mysql_stmt_prepare()
keine
PREPARE
-, EXECUTE
- oder
DEALLOCATE PREPARE
-Anweisung vorbereiten.
Die SQL-Syntax für vorbereitete Anweisungen kann in gespeicherten Prozeduren, nicht aber in gespeicherten Funktionen oder Triggern verwendet werden.
Bei der Verwendung vorbereiteter Anweisungen können für die
Argumente der LIMIT
-Klausel Platzhalter
eingesetzt werden. Siehe auch Abschnitt 13.2.7, „SELECT
“.
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.