Sto importando un gran numero di file di grandi dimensioni in un numero di tabelle da partizionare usando loop all'interno di un blocco di codice plpgsql anonimo $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'intero processo dovrebbe richiedere circa 15 ore e spero che tutte le importazioni non vengano ripristinate in caso di errore di importazione a un certo punto.
IIRC COMMIT
non funziona con le funzioni memorizzate perché l'intera funzione viene trattata come una singola transazione.
Dalla documentazione per$do$
Il blocco di codice viene trattato come se fosse il corpo di una funzione senza parametri, restituendo vuoto. Viene analizzato ed eseguito una sola volta.
Suppongo che questo significhi che l'intera $do$
è una transazione, quindi i commit all'interno del blocco non funzioneranno. Ho ragione?
BEGIN
oCOMMIT
nel corpo della funzione. Otterrai un'eccezione, perché ciò non è consentito (non possibile).