37.9. Erreurs et Messages

Utilisez l'instruction RAISE pour rapporter des messages et lever des erreurs.

RAISE niveau 'format' [, variable [, ...]];

Possible levels are DEBUG, LOG, INFO, NOTICE, WARNING, and EXCEPTION. EXCEPTION raises an error and aborts the current transaction; the other levels only generate messages of different priority levels. Whether messages of a particular priority are reported to the client, written to the server log, or both is controlled by the log_min_messages and client_min_messages configuration variables. See Section 16.4 for more information. Les niveaux possibles sont DEBUG LOG, INFO, NOTICE, WARNING et EXCEPTION. EXCEPTION lève une erreur et interrompt la transaction courante). Les autres niveaux ne font que générer des messages aux différents niveaux de priorité. Quand les messages d'une priorité particulière sont indiqués par le client, écrit dans les traces du serveur, ou à la fois contrôlé par les variables de configuration log_min_messages et client_min_messages. Voir Section 16.4 pour plus d'informations.

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 prochaine 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'ajouter quelques champs au message indiquant à quelle fonction et à quel endroit (numéro de ligne et type d'instruction) l'erreur s'est produite. L"rreur stoppe à chaque fois l'exécution de la fonction.