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
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.
|