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).