Commitir transacciones mientras se ejecuta una función postgreql

Tengo la función Postgresql que tiene que INSERTAR alrededor de 1,5 millones de datos en una tabla. Lo que quiero es que quiera que la tabla se llene con cada inserción de registros. Actualmente, lo que está sucediendo cuando bash decir aproximadamente 1000 registros, el get se rellena solo después de que se ejecuta la función completa. Si detengo la función a la mitad, no se llenan los datos. ¿Cómo puedo comprometer el registro incluso si paro después de que se haya insertado cierto número de registros?

Esto se puede hacer usando dblink. Mostré un ejemplo con una inserción comprometida. Necesitarás agregar tu lógica de bucle while y comprometer cada bucle. Puede http://www.postgresql.org/docs/9.3/static/contrib-dblink-connect.html

CREATE OR REPLACE FUNCTION log_the_dancing(ip_dance_entry text) RETURNS INT AS $BODY$ DECLARE BEGIN PERFORM dblink_connect('dblink_trans','dbname=sandbox port=5433 user=postgres'); PERFORM dblink('dblink_trans','INSERT INTO dance_log(dance_entry) SELECT ' || '''' || ip_dance_entry || ''''); PERFORM dblink('dblink_trans','COMMIT;'); PERFORM dblink_disconnect('dblink_trans'); RETURN 0; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION log_the_dancing(ip_dance_entry text) OWNER TO postgres; BEGIN TRANSACTION; select log_the_dancing('The Flamingo'); select log_the_dancing('Break Dance'); select log_the_dancing('Cha Cha'); ROLLBACK TRANSACTION; --Show records committed even though we rolled back outer transaction select * from dance_log; 

Lo que está pidiendo generalmente se llama transacción autónoma .

PostgreSQL no admite transacciones autónomas en este momento (9.4).

Para apoyarlos adecuadamente, realmente necesita procedimientos almacenados, no solo las funciones definidas por el usuario que actualmente admite. También es muy complicado implementar tx autónomos en PostgreSQL por una variedad de razones internas relacionadas con su sesión y modelo de proceso.

Por ahora, use dblink como lo sugirió Bob.

Para Postgresql 9.5 o posterior, puede utilizar los trabajadores dynamics de fondo provistos por la extensión pg_background. Crea una transacción autónoma. Por favor, consulte la página github de la extensión. La solución es mejor que db_link. Hay una guía completa sobre soporte de transacciones autónomas en PostgreSQL . Hay una tercera forma de iniciar una transacción autónoma en Postgres, pero algunos parches son necesarios. Consulte la propuesta de parche Eisentraut de Peter para las transacciones al estilo de OracleDB.

    Intereting Posts