Le code Tcl contenu ou appelé à partir d'une fonction PL/Tcl peut lever
une erreur, soit en exécutant des opérations invalides ou en générant
une erreur en utilisant la commande Tcl error
ou la
commande PL/Tcl elog
. Si une erreur n'est pas
rattrapée mais est autorisée à être propagée en dehors du niveau racine de
l'exécution de la fonction PL/Tcl, elle est rapportée comme une erreur SQL
dans la requête appelant la fonction.
Les erreurs SQL survenant dans les commandes PL/Tcl
spi_exec
, spi_prepare
et spi_execp
sont rapportées comme des erreurs Tcl,
donc elles sont récupérables par la commande Tcl catch
.
(Chacune des ces commandes PL/Tcl exécutent leurs opérations SQL dans une
sous transaction, qui est annulée en cas d'erreur, si bien que n'importe
quelle opération partiellement terminée sera automatiquement nettoyée.)
De la même façon, si une erreur se propage en dehors du niveau racine sans
avoir été rattrapée, elle sera rapportée en erreur SQL.
Tcl fournit une variable errorCode
pouvant représenter
des informations supplémentaires sur une erreur dans un format qui est
simple à interpréter pour les programmes Tcl. Le contenu est dans le format
liste Tcl, et le premier mot identifie le sous-système ou la bibliothèque
rapportant l'errer ; au delà, le contenu est laissé au sous-système
individuel ou à la bibliothèque. Pour les erreurs au niveau base rapportées
par les commandes PL/Tcl commands, le premier mot est
POSTGRES
, le second est le numéro de version du serveur,
et les mots supplémentaires sont les paires nom/valeur des champs fournissant
des informations détaillées sur l'erreur.
Les champs SQLSTATE
, condition
et message
sont toujours fournies (les deux premiers
représentent le code d'erreur et le nom de la condition comme indiqués dans
Annexe A). Les champs potentiellement présents
incluent
detail
, hint
, context
,
schema
, table
, column
,
datatype
, constraint
,
statement
, cursor_position
,
filename
, lineno
et
funcname
.
Une façon agréable de travailler avec l'information
errorCode
de PL/Tcl est de la charger dans un tableau
pour que les noms du champ deviennent des indices du tableau. Un code
relatif ressemblerait à ceci :
if {[catch { spi_exec $sql_command }]} { if {[lindex $::errorCode 0] == "POSTGRES"} { array set errorArray $::errorCode if {$errorArray(condition) == "undefined_table"} { # gestion de la table manquante } else { # gestion des autres types d'erreur SQL } } }
(Les symboles deux-points spécifient explicitement que
errorCode
est une variable globale.)