Prendre un thé
Tapoter des doights
Monsieur fantôme
Quelle heure est-il ?
BazinGa's Tips & tuto IT
BazinGa's - Tips & tuto IT

Erreur PostgreSQL – Attrapez les toutes !! Et faites parler le Postgresdex

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

50%