Gestire le eccezioni in MariaDB

Mattepuffo's logo
Gestire le eccezioni in MariaDB

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!


Condividi

Commentami!