Élégante façon de gérer PostgreSQL exceptions?

Dans PostgreSQL, je voudrais créer un coffre-mécanisme d'emballage qui retourne un résultat vide si une exception se produit. Considérez les points suivants:

SELECT * FROM myschema.mytable;

Je pouvais faire le coffre d'habillage dans l'application client:

try {
    result = execute_query('SELECT value FROM myschema.mytable').fetchall();
}
catch(pg_exception) {
    result = []
}

Mais ai-je pu faire une telle chose en SQL directement? Je voudrais faire le code suivant travail, mais il semble comme il se doit par le mettre en DO $$ ... $$ bloc et là je suis perdu.

BEGIN
    SELECT * FROM myschema.mytable;
EXCEPTION WHEN others THEN
    SELECT unnest(ARRAY[]::TEXT[])
END
DO ne retourne rien. Vous devez utiliser une procédure stockée (avec la langue plpgsql -- pour la gestion des exceptions). - pas de lignes retournées n'est pas égal à un ligne unique retourné, avec un tableau vide en elle (c'est à dire en js, cela signifie [] != [{col1:[]}]).
Désolé pour ça, j'ai ajouté unnest à mon exemple pour produire le comportement souhaité (vous ne savez pas comment faire cela de manière plus élégante). De toute façon, dois-je déclarer la procédure à chaque fois que je suis à l'exécution d'une requête avec la gestion des exceptions? Il n'y a pas d'autre option?
Donc, vous voulez défendre contre tout et alll exceptions ou êtes-vous juste peur que la table peut ne pas exister? Et que voulez-vous revenir? Une valeur unique de la seule colonne value? Ou un ensemble de lignes? Et est-ce pour hard-codée nom de la table ou pour toute une série de noms de table?
non, si vous voulez faire gestion des exceptions de plus simple, les requêtes, cette opération est généralement effectuée par le client, et non sur le serveur. plpgsql's la gestion des exceptions est principalement stockée "logique". Mais ce type d'exception-vous peur? Peut-être, il existe une alternative.
En fait, dans mon cas précis, je suis très inquiète à propos des conditions de course. Je suis en utilisant SELECT ('myschema','mytable') IN (SELECT table_schema,table_name FROM information_schema.tables); pour vérifier si la table existe, et si c'est le cas, je suis à la sélection de ses lignes. Mais il arrive souvent que le tableau cesse d'exister avant la deuxième requête est exécutée (c'est à dire, l'idiome "si la table existe, sélectionner son contenu" ne fonctionne pas). C'est pourquoi je voudrais simplement revenir à vide suite si une exception se produit.

OriginalL'auteur Tregoreg | 2015-02-10