Estou importando um grande número de arquivos grandes para um número de tabelas a serem particionadas usando loops dentro de 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 nas funções armazenadas, pois a função inteira é tratada como uma única transação.
A partir da documentação para$do$
O bloco de código é tratado como se fosse o corpo de uma função sem parâmetros, retornando nulo. É analisado e executado uma única vez.
Estou assumindo que isso significa que toda a $do$
transação é uma e, portanto, as confirmações dentro do bloco não funcionarão. Estou correcto?
postgresql
transaction
plpgsql
postgresql-9.5
raphael
fonte
fonte
BEGIN
ouCOMMIT
no corpo da função. Você receberá uma exceção, porque isso não é permitido (não é possível).Respostas:
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 para criar uma transação fora do bloco, por exemplo:
BTW,
DO BLOCKS
tem o mesmo efeito que funciona quem retornavoid
.Por favor, veja mais no documento:
fonte
A única solução a ser confirmada nos blocos "DO" (ou funções) (para a versão Postgresql menor que 11) é usar a conexão dblink no mesmo servidor e executar suas consultas lá. Lembre-se da visibilidade de variáveis e objetos temporários.
mais informações sobre dblink Iniciando com o controle de transações Postgresql-11 de dentro do bloco "DO" está disponível enquanto o "bloco DO" não está sendo executado em outra transação.
fonte
dblink
você abrirá outra transação, para que suaCOMMIT
ligação não afete a transação, se não me engano.