J'importe un grand nombre de fichiers volumineux dans un certain nombre de tables à partitionner à l'aide de boucles dans un bloc de code plpgsql anonyme $do$
.
$do$
BEGIN
FOR yyyy in 2012..2016 THEN
EXECUTE $$COPY table$$||yyyy||$$ FROM 'E:\data\file$$||yyyy||$$.csv DELIMITER ',' CSV;$$;
END LOOP;
END;
$do$ LANGUAGE plpgsql
L'ensemble de ce processus devrait prendre environ 15 heures et j'espère que toutes les importations ne seront pas annulées s'il y a une erreur d'importation à un moment donné.
IIRC COMMIT
ne fonctionne pas dans les fonctions stockées car la fonction entière est traitée comme une seule transaction.
À partir de la documentation de$do$
Le bloc de code est traité comme s'il s'agissait du corps d'une fonction sans paramètre, renvoyant void. Il est analysé et exécuté une seule fois.
Je suppose que cela signifie que l'intégralité $do$
est une transaction, et donc les validations dans le bloc ne fonctionneront pas. Ai-je raison?
BEGIN
ouCOMMIT
dans le corps de la fonction. Vous obtiendrez une exception, car ce n'est pas autorisé (pas possible).Réponses:
Non,
Vous ne pouvez pas contrôler une transaction à l'intérieur d'une
plpgsql
fonction (ou d'un bloc anonyme).La seule option que vous avez sa création d'une transaction en dehors du bloc, par exemple:
BTW,
DO BLOCKS
ont le même effet qui fonctionne qui revientvoid
.S'il vous plaît, voir plus sur le doc:
la source
La seule solution à valider dans des blocs (ou fonctions) "DO" (pour la version Postgresql inférieure à 11) est d'utiliser une connexion dblink au même serveur et d'y exécuter vos requêtes. Gardez simplement à l'esprit la visibilité des variables et des objets temporaires.
plus d'informations sur dblink À partir de Postgresql-11, le contrôle des transactions depuis l'intérieur du bloc "DO" est disponible pendant que "DO-block" ne s'exécute pas dans une autre transaction.
la source
dblink
vous ouvrira une autre transaction, donc votreCOMMIT
appel n'affectera pas la transaction appelante, si je ne me trompe pas.