DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement handler_type: CONTINUE | EXIT | UNDO condition_value: SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION | mysql_error_code
Cette commande spécifie les gestionnaires qui vont traiter une ou plusieurs conditions. Si une de ces conditions survient, le gestionnaire associé est appelé.
Pour un gestionnaire CONTINUE
, l'exécution
de la routine courante continue après l'exécution du
gestionnaire. Pour un gestionnaire EXIT
,
l'exécution de la routine est terminée. Le gestionnaire
UNDO
n'est pas encore supporté.
Actuellement, UNDO
se comporte comme
CONTINUE
.
SQLWARNING
est un raccourci pour toutes
les codes SQLSTATE
qui commencent par
01.
NOT FOUND
est un raccourci pour toutes
les codes SQLSTATE
qui commencent par
02.
EXCEPTION
est un raccourci pour toutes
les codes SQLSTATE
qui ne sont pas
représenté par SQLWARNING
ou
NOT FOUND
.
En plus des valeurs SQLSTATE
, les codes
d'erreur MySQL sont aussi supportés.
Par exemple :
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 '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)
Notez que @x
vaut 3, ce qui signifie que
MySQL a exécuté la procédure jusqu'à la fin. Si la ligne
DECLARE CONTINUE HANDLER FOR '23000' SET @x2 =
1;
était absente, MySQL aurait pris le chemin par
défaut (EXIT
) après l'échec du second
INSERT
, dû à la contrainte de
PRIMARY KEY
, et SELECT
@x
aurait retourné 2.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.