Estoy importando una gran cantidad de archivos grandes en varias tablas para ser particionadas usando bucles dentro de un bloque 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 este proceso debería tomar alrededor de 15 horas y espero que todas las importaciones no se reviertan si hay un error de importación en algún momento.
IIRC COMMIT
no funciona dentro de las funciones almacenadas porque toda la función se trata como una sola transacción.
De la documentación para$do$
El bloque de código se trata como si fuera el cuerpo de una función sin parámetros, que devuelve nulo. Se analiza y ejecuta una sola vez.
Supongo que esto significa que la totalidad $do$
es una transacción, por lo que las confirmaciones dentro del bloque no funcionarán. ¿Estoy en lo correcto?
BEGIN
oCOMMIT
en el cuerpo de la función. Obtendrá una excepción, porque eso no está permitido (no es posible).Respuestas:
No,
No puede controlar una transacción dentro de una
plpgsql
función (o bloque anónimo).La única opción que tiene es crear una transacción fuera del bloque, por ejemplo:
Por cierto,
DO BLOCKS
tienen el mismo efecto que funciona quién regresavoid
.Por favor, vea más en el documento:
fuente
La única solución para comprometerse dentro de los bloques (o funciones) "DO" (para la versión Postgresql anterior a la 11) es usar la conexión dblink al mismo servidor y ejecutar sus consultas allí. Solo tenga en cuenta las variables y la visibilidad de los objetos temporales.
más información sobre dblink Comenzar con el control de transacciones Postgresql-11 desde el interior del bloque "DO" está disponible mientras "DO-block" no se está ejecutando dentro de otra transacción.
fuente
dblink
usted abrirá otra transacción, por lo que suCOMMIT
llamada no afectará la transacción de la llamada, si no me equivoco.