DECLAREhandler_type
HANDLER FORcondition_value
[,...]statement
handler_type
: CONTINUE | EXIT | UNDOcondition_value
: SQLSTATE [VALUE]sqlstate_value
|condition_name
| SQLWARNING | NOT FOUND | SQLEXCEPTION |mysql_error_code
Die DECLARE ... HANDLER
-Anweisung
deklariert Handler, die jeweils eine oder mehrere Bedingungen
behandeln können. Wenn eine dieser Bedingungen eintritt, wird
das angegebene statement
ausgeführt. statement
kann eine
einfache Anweisung sein (beispielsweise SET
) oder auch eine
zusammengesetzte Anweisung in einem var_name
=
value
BEGIN
... END
-Block (siehe
Abschnitt 19.2.5, „BEGIN ... END
-Syntax für komplexe Anweisungen“).
Ein CONTINUE
-Handler lässt die Ausführung
der aktuellen Routine nach der Ausführung der
Handler-Anweisung weiterlaufen. Ein
EXIT
-Handler dagegen beendet die
Ausführung für die zusammengesetzte BEGIN ...
END
-Anweisung, in der er deklariert ist. (Das gilt
selbst dann, wenn die Bedingung in einem inneren Block
eintritt.) Eine Anweisung des Typs
UNDO
-Handler wird zurzeit noch nicht
unterstützt.
Wenn eine Bedingung eintritt, für die kein Handler deklariert
wurde, ist die Standardaktion ein EXIT
.
Ein condition_value
kann einer der
folgenden Werte sein:
Ein SQLSTATE-Wert oder MySQL-Fehlercode.
Ein zuvor mit DECLARE ... CONDITION
deklarierter Bedingungsname. Siehe
Abschnitt 19.2.8.1, „DECLARE
-Bedingungen“.
SQLWARNING
ist eine Abkürzung für
alle SQLSTATE-Codes, die mit 01
beginnen.
NOT FOUND
ist eine Abkürzung für alle
SQLSTATE-Codes, die mit 02
beginnen.
SQLEXCEPTION
ist eine Abkürzung für
alle SQLSTATE-Codes, die nicht unter
SQLWARNING
oder NOT
FOUND
fallen.
Beispiel:
mysql>CREATE TABLE test.t (s1 int,primary key (s1));
Query OK, 0 rows affected (0.00 sec) mysql>delimiter //
mysql>CREATE PROCEDURE handlerdemo ()
->BEGIN
->DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1;
->SET @x = 1;
->INSERT INTO test.t VALUES (1);
->SET @x = 2;
->INSERT INTO test.t VALUES (1);
->SET @x = 3;
->END;
->//
Query OK, 0 rows affected (0.00 sec) mysql>CALL handlerdemo()//
Query OK, 0 rows affected (0.00 sec) mysql>SELECT @x//
+------+ | @x | +------+ | 3 | +------+ 1 row in set (0.00 sec)
Dieses Beispiel verbindet einen Handler mit der Bedingung
SQLSTATE 23000, die bei doppelten Schlüsselwerten eintritt.
Beachten Sie, dass @x
die
3
ist: Dies zeigt, dass MySQL die Prozedur
bis zum Ende ausgeführt hat. Wäre die Zeile DECLARE
CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1;
nicht vorhanden, hätte MySQL den Standardweg
(EXIT
) eingeschlagen, nachdem das zweite
INSERT
an dem PRIMARY
KEY
-Constraint gescheitert ist, und SELECT
@x
hätte eine 2
zurückgegeben.
Wenn Sie eine Bedingung ignorieren möchten, können Sie einen
CONTINUE
-Handler für sie deklarieren und
mit einem leeren Block verbinden. Zum Beispiel:
DECLARE CONTINUE HANDLER FOR SQLWARNING BEGIN END;
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.