PostgreSQLLa base de données la plus sophistiquée au monde.

Version anglaise

43.8. Gestion des erreurs avec PL/Tcl

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, Codes d'erreurs de PostgreSQL). 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.)