DECLARE HANDLER
Sintassi
DECLARE tipo_handler HANDLER FOR condizione [, condizione] ... istruzione tipo_handler: CONTINUE | EXIT | UNDO condizione: SQLSTATE [VALUE] valore_sqlstate | nome_condizione | SQLWARNING | NOT FOUND | SQLEXCEPTION | codice_errore_mariadb
Spiegazione
L'istruzione DECLARE ... HANDLER
specifica un handler che può gestire una o più condizioni. Se una di queste condizioni si verifica, l'istruzione specificata viene eseguita. Essa può essere un comando semplice (per esempio, SET nome_var = valore), o un'istruzione composta scritta con BEGIN e END.
Nel caso degli handler di tipo CONTINUE, dopo l'esecuzione dell'istruzione il programma continua a girare. Nel caso di un handler EXIT, l'esecuzione del blocco BEGIN ... END
in cui si trova l'handler viene terminata. Questo avviene anche se la condizione si verifica in un blocco più interno. Il tipo di handler UNDO non è supportato.
Se si verifica una condizione per la quale non è stato dichiarato alcun handler, l'azione predefinita è EXIT.
La clausola condizione può assumere uno dei seguenti valori:
- Un valore SQLSTATE (astringa letterale di 5 caratteri) o un codice di errore di MariaDB (numero). Non bisogna usare un valore SQLSTATE di '00000' o un codice errore 0, perché essi significano che non vi è alcun errore. Per una lista di SQLSTATE e codici di errore, si veda http://dev.mysql.com/doc/refman/5.1/en/error-messages-server.html.
- Una condizione precedentemente dichiarata con
DECLARE ... CONDITION
. Si veda DECLARE CONDITION. - SQLWARNING è una abbreviazione che indica la classe di valori SQLSTATE che iniziano con '01'.
- NOT FOUND è l'abbreviazione per la classe di valori SQLSTATE che iniziano con '02'. Si usa per controllare cosa accade quando un cursore raggiunge la fine di un set di risultati. Se non vi sono più record da leggere, si verifica una condizione No Data e si ottiene un valore SQLSTATE di 02000. Per rilevare questo evento si può dichiarare un handler o una condizione NOT FOUND. Un esempio è presente alla pagina http://dev.mysql.com/doc/refman/5.1/en/cursors.html. Questa condizione si verifica anche con un'istruzione SELECT ... INTO lista_variabili che non trova alcuna riga.
- SQLEXCEPTION è una abbreviazione per la classe di errori SQLSTATE che non inizia con '00', né '01', né '02'.
Esempi
MariaDB [test]> CREATE TABLE test.t (s1 INT, PRIMARY KEY (s1)); Query OK, 0 rows affected (0.11 sec) MariaDB [test]> delimiter // MariaDB [test]> MariaDB [test]> 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) MariaDB [test]> CALL handlerdemo()// Query OK, 0 rows affected (0.00 sec) MariaDB [test]> SELECT @x// +------+ | @x | +------+ | 3 | +------+ 1 row in set (0.00 sec)