Ich importiere eine große Anzahl großer Dateien in eine Reihe von Tabellen, die mithilfe von Schleifen in einem anonymen plpgsql-Codeblock partitioniert werden sollen $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
Dieser gesamte Vorgang sollte ungefähr 15 Stunden dauern, und ich hoffe, dass nicht alle Importe zurückgesetzt werden, wenn irgendwann ein Importfehler auftritt.
IIRC COMMIT
funktioniert nicht in gespeicherten Funktionen, da die gesamte Funktion als einzelne Transaktion behandelt wird.
Aus der Dokumentation für$do$
Der Codeblock wird so behandelt, als wäre er der Hauptteil einer Funktion ohne Parameter, wodurch void zurückgegeben wird. Es wird einmal analysiert und ausgeführt.
Ich gehe davon aus, dass dies bedeutet, dass die gesamte $do$
Transaktion eine Transaktion ist und Commits innerhalb des Blocks daher nicht funktionieren. Hab ich recht?
quelle
BEGIN
oderCOMMIT
im Funktionskörper. Sie erhalten eine Ausnahme, da dies nicht zulässig (nicht möglich) ist.Antworten:
Nein,
Sie können eine Transaktion innerhalb einer
plpgsql
Funktion (oder eines anonymen Blocks) nicht steuern .Die einzige Option, mit der Sie eine Transaktion außerhalb des Blocks erstellen können, z.
Übrigens,
DO BLOCKS
haben den gleichen Effekt wie Funktionen, die zurückkehrenvoid
.Weitere Informationen finden Sie im Dokument:
quelle
Die einzige Lösung, die innerhalb von "DO" -Blöcken (oder Funktionen) (für Postgresql-Version unter 11) festgeschrieben werden kann, besteht darin, eine dblink-Verbindung zu demselben Server zu verwenden und Ihre Abfragen dort auszuführen. Denken Sie nur an die Sichtbarkeit von Variablen und temporären Objekten.
Weitere Informationen zu dblink Ab Postgresql-11 ist die Transaktionssteuerung innerhalb des "DO" -Blocks verfügbar, während "DO-Block" nicht in einer anderen Transaktion ausgeführt wird.
quelle
dblink
Ihnen öffnet eine weitere Transaktion, sodass IhrCOMMIT
Anruf dort keine Auswirkungen auf die anrufende Transaktion hat, wenn ich mich nicht irre.