| 20.1.7 Conditions et gestionnaires
 20.1 Syntaxe des procédures stockées
 20 Procédures stockées et fonctions
 Manuel de Référence MySQL 4.1 : Version Française
 
 . DECLARE une condition
 ->DECLARE un gestionnaire
 
 
 | 
  20.1.7.2 DECLARE un gestionnaire  
 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
 .| 
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
 | 
 
En plus des valeurs  
SQLSTATE
 , les codes d'erreur  
MySQL
  sont aussi
supportés.
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
 .
 
Par exemple :
 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.| 
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)
 | 
 |