Previous Up Next
Université Lille 3-Charles de GaulleUFR de Mathématiques Sciences Économiques et Sociales

Chapitre 60  PL/pgSQL : erreurs et messages

Utilisez l'instruction RAISE pour rapporter des messages et lever des erreurs.
RAISE niveau 'format' [, variable [, ...]];
Les niveaux possibles sont DEBUG (écrit le message sur le log du serveur), LOG (écrit le message sur le log du serveur avec une priorité plus élevée), INFO, NOTICE et WARNING (écrit le message sur le log du serveur et l'envoie au client avec des priorités respectivement supérieures), et EXCEPTION (lève une erreur et interrompt la transaction courante). Que les messages d'une priorité particulière soient rapportés au client, écrits dans le log du serveur, ou les deux est controlé par les variables de configuration log_min_messages et client_min_messages.

Au sein de la chaîne de formatage, % est remplacé par la représentation de la chaîne argument optionnelle suivante. Écrivez %% pour signifier un caractère %. Notez que les arguments optionnels doivent actuellement être de simples variables, non des expressions et que le format doit être une simple chaîne de caractères.

Dans cet exemple, la valeur de v_job_id remplacera le % dans la chaîne.
RAISE NOTICE ''Calling cs_create_job(%)'', v_job_id;
Cet exemple interrompra la transaction avec le message d'erreur donné.
RAISE EXCEPTION ''Inexistent ID --> %'', user_id;
PostgreSQL n'a pas un modèle d'exceptions très malin. Lorsque l'analyseur, planificateur/optimiseur ou exécuteur décide qu'une instruction ne peux pas continuer à être traitée, l'entière transaction s'interrompt et le système renvient à la boucle principale pour reçevoir la prochaîne commande de l'application client.

Il est possible de faire un crochet par le mécanisme d'erreurs pour examiner ce qui se passe. Mais actuellement il est impossible de dire ce qui a causé réellement l'interruption (erreur de format de type de données, erreur de virgule flottante, erreur de syntaxe, etc.). Et il est possible que le serveur de base de données soit dans un état inconscient à ce point, et que renvoyer à l'exécuteur supérieur ou traiter d'autres commandes puisse corrompre la base de données entière.

Ainsi, la seule chose que PL/pgSQL fait actuellement quand il rencontre une interruption dans une procédure fonction ou déclencheur est d'écrire quelques messages de log additionnels de niveau NOTICE indiquant dans quelle fonction et à quel endroit (numéro de ligne et type d'instruction) c'est arrivé. L'erreur arrête toujours l'exécution de la fonction.
D.Gonzalez (gonzalez@univ-lille3.fr) en date du th , 

Previous Up Next