Gestire le eccezioni in MariaDB
Supponiamo di avere una tabella con un campo impostato come chiave univoca e uno che non accetta valori nulli.
E vogliamo creare una Stored Procedure che inserisca i record e che ci invii o l'ultimo id inserito, o gli errori.
In MariaDB (e in MySQL) possiamo usare DECLARE HANDLER!
Come handler type possiamo impostare:
- EXIT
- CONTINUE
- UNDO
Mentre come condizione da controllare:
- SQLSTATE [VALUE] sqlstate_value
- condition_name
- SQLWARNING
- NOT FOUND
- SQLEXCEPTION
- mariadb_error_code
Ecco la nostra SP:
DELIMITER //
DROP PROCEDURE IF EXISTS add_persona //
CREATE PROCEDURE add_persona(IN email VARCHAR(50), IN nome VARCHAR(50), IN cognome VARCHAR(50))
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT;
SELECT @errno, @sqlstate, @text;
END;
INSERT INTO persone VALUES(NULL, email, nome, cognome);
SELECT LAST_INSERT_ID() AS last_id;
END
In pratica, con GET DIAGNOSTICS, andiamo a controllare se ci sono SQLEXCEPTION.
In tal caso stoppiamo lo script e mandiamo in output l'errore.
Sennò facciamo un inserimento e visualiziamo l'ultimo id inserito.
Facciamo qualche prova, considerando che la tabella è vuota:
MariaDB [test]> CALL add_persona('m@m.it', 'n1', 'c1');
+---------+
| last_id |
+---------+
| 1 |
+---------+
1 row in set (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
MariaDB [test]> CALL add_persona('m@m.it', 'n1', 'c1');
+--------+-----------+---------------------------------------------+
| @errno | @sqlstate | @text |
+--------+-----------+---------------------------------------------+
| 1062 | 23000 | Duplicate entry 'm@m.it' for key 'uq_email' |
+--------+-----------+---------------------------------------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
MariaDB [test]> CALL add_persona('m@m2.it', NULL, 'c1');
+--------+-----------+------------------------------+
| @errno | @sqlstate | @text |
+--------+-----------+------------------------------+
| 1048 | 23000 | Column 'nome' cannot be null |
+--------+-----------+------------------------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Enjoy!
database sql mariadb mysql declare handler diagnostics sqlexception
Commentami!