Estou importando um grande número de arquivos grandes em várias tabelas a serem particionadas usando loops em um bloco de código plpgsql anônimo $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
Todo esse processo deve levar cerca de 15 horas e espero que todas as importações não sejam revertidas se houver um erro de importação em algum momento.
O IIRC COMMIT
não funciona em funções armazenadas porque toda a função é tratada como uma única transação.
O bloco de código é tratado como se fosse o corpo de uma função sem parâmetros, retornando void. Ele é analisado e executado uma única vez.
Estou assumindo que isso significa que o todo $do$
é uma transação e, portanto, os commits dentro do bloco não funcionarão. Estou correcto?
Não,
Você não pode controlar uma transação dentro de uma
plpgsql
função (ou bloco anônimo).A única opção que você tem é criar uma transação fora do bloco, ex:
BTW,
DO BLOCKS
tem o mesmo efeito que as funções que retornamvoid
.Por favor, veja mais no doc:
A única solução para confirmar dentro de blocos "DO" (ou funções) (para a versão do Postgresql menor que 11) é usar a conexão dblink para o mesmo servidor e executar suas consultas lá. Basta ter em mente variáveis e visibilidade de objetos temporários.
mais informações sobre dblink Iniciando com o Postgresql-11 o controle de transações de dentro do bloco "DO" está disponível enquanto "DO-block" não está sendo executado em outra transação.