Je ne sais pas vous, mais pour ma part, il m’arrive souvent d’avoir des erreurs dans mes procédure en plpgsql qui sont plus ou moins « attendues » et qui ne doivent pas stopper l’exécution de la suite de la procédure. Cependant, il est intéressant de pouvoir afficher quelques informations sur ces erreur pour pouvoir analyser le traitement à postériori.
Heureusement, PostgreSQL possède tout ce qu’il faut pour attraper ces erreurs puis pour les analyser. Vous trouverez d’ailleurs de nombreux détails ici.
Voici un petit bout de code SQL notifiant les erreurs rencontrées :
DO $corps$ DECLARE v_erreur_code TEXT; v_erreur_msg TEXT; v_erreur_msg_detail TEXT; v_erreur_astuce TEXT; v_erreur_context TEXT; v_erreur_schema TEXT; v_erreur_table TEXT; v_erreur_colonne TEXT; v_erreur_contrainte TEXT; -- Démarrage du bloc de transaction BEGIN -- Création d'une sous transaction susceptible de rencontrer une erreur BEGIN -- Génération d'une erreur SELECT ''::numeric; -- Attrapage de l'erreur (attrapez les toutes !!) EXCEPTION -- Condition permettant de spécifier quelle erreur attraper (ici toutes) WHEN OTHERS -- Récupération des variables d'information sur l'erreur (le fameux Postgresdex) THEN GET STACKED DIAGNOSTICS v_erreur_code = RETURNED_SQLSTATE; GET STACKED DIAGNOSTICS v_erreur_msg = MESSAGE_TEXT; GET STACKED DIAGNOSTICS v_erreur_msg_detail = PG_EXCEPTION_DETAIL; GET STACKED DIAGNOSTICS v_erreur_astuce = PG_EXCEPTION_HINT; GET STACKED DIAGNOSTICS v_erreur_context = PG_EXCEPTION_CONTEXT; GET STACKED DIAGNOSTICS v_erreur_schema = SCHEMA_NAME; GET STACKED DIAGNOSTICS v_erreur_table = TABLE_NAME; GET STACKED DIAGNOSTICS v_erreur_colonne = COLUMN_NAME; GET STACKED DIAGNOSTICS v_erreur_contrainte = CONSTRAINT_NAME; -- Message d'information sur l'erreur (le niveau NOTICE permet de ne pas stopper l'execution du code) RAISE NOTICE USING MESSAGE = 'Code erreur : ' || v_erreur_code || chr(10) || 'Message : ' || v_erreur_msg || chr(10) || 'Détail : ' || v_erreur_msg_detail || chr(10) || 'Astuce : ' || v_erreur_astuce || chr(10) || 'Contexte : ' || v_erreur_context || chr(10) || 'Schéma : ' || v_erreur_schema || chr(10) || 'Table : ' || v_erreur_table || chr(10) || 'Colonne : ' || v_erreur_colonne || chr(10) || 'Contrainte : ' || v_erreur_contrainte || chr(10) ; -- Fin de la sous-transaction et poursuite de l'execution du code END; RAISE NOTICE USING MESSAGE = 'La suite est exécutée'; END $corps$ ;
PS : toutes mes excuses pour le jeu de mot foireux à base de Pokédex et de Postgres…
Cet article vous a plu ?
N'hésitez pas à le partager, il interessera surement certains de vos contacts.
Les thèmes suivants contiennent des articles en lien avec celui-ci, allez faire un tour :
BDDPostgreSQLProgrammationSQL catcherreurexceptionnotice