Importuję dużą liczbę dużych plików do wielu tabel, które mają być podzielone na partycje za pomocą pętli w anonimowym bloku kodu plpgsql $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
Cały ten proces powinien zająć około 15 godzin i mam nadzieję, że cały import nie zostanie przywrócony, jeśli w pewnym momencie wystąpi błąd importu.
IIRC COMMIT
nie działa w ramach przechowywanych funkcji, ponieważ cała funkcja jest traktowana jako pojedyncza transakcja.
Blok kodu jest traktowany tak, jakby był ciałem funkcji bez parametrów, zwracając wartość void. Jest analizowany i wykonywany jednorazowo.
Zakładam, że oznacza to, że całość $do$
jest jedną transakcją, więc zatwierdzenia w bloku nie będą działać. Mam rację?
BEGIN
lubCOMMIT
w treści funkcji. Otrzymasz wyjątek, ponieważ jest to niedozwolone (niemożliwe).