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).Odpowiedzi:
Nie,
Nie można kontrolować transakcji wewnątrz
plpgsql
funkcji (lub anonimowego bloku).Jedyną opcją jest utworzenie transakcji poza blokiem, np .:
BTW,
DO BLOCKS
mają ten sam efekt, co funkcje, które powracavoid
.Proszę zobaczyć więcej w dokumencie:
źródło
Jedynym rozwiązaniem do zatwierdzenia w blokach (lub funkcjach DO) (dla wersji Postgresql mniejszej niż 11) jest użycie połączenia dblink z tym samym serwerem i wykonanie tam zapytań. Pamiętaj tylko o widoczności zmiennych i obiektów tymczasowych.
więcej informacji o dblink Począwszy od Postgresql-11 kontrola transakcji z bloku „DO” jest dostępna, gdy „DO-blok” nie działa w ramach innej transakcji.
źródło
dblink
tobą otworzy kolejną transakcję, więc twojeCOMMIT
połączenie nie wpłynie na transakcję połączenia, jeśli się nie mylę.