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?
BEGIN
oderCOMMIT
im Funktionskörper. Sie erhalten eine Ausnahme, da dies nicht zulässig (nicht möglich) ist.