Commettere transazioni mentre si esegue una funzione postgreql

Ho la funzione Postgresql che deve INSERIRE circa 1,5 milioni di dati in una tabella. Quello che voglio è che voglio vedere la tabella popolata con ogni inserimento di record. Attualmente ciò che sta accadendo quando sto provando con dire circa 1000 record, il get viene popolato solo dopo l’esecuzione della funzione completa. Se interrompo la funzione a metà, nessun dato viene popolato. Come posso rendere il record impegnato anche se mi fermo dopo che è stato inserito un certo numero di record?

Questo può essere fatto usando dblink. Ho mostrato un esempio con un inserto impegnato, dovrai aggiungere la tua logica del ciclo while e commettere ogni ciclo. Puoi 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; 

Quello che stai chiedendo è generalmente chiamato una transazione autonoma .

PostgreSQL non supporta le transazioni autonome in questo momento (9.4).

Per supportarli in modo corretto, ha davvero bisogno di stored procedure, non solo delle funzioni definite dall’utente che attualmente supporta. È anche molto complicato implementare tx autonomi in PostgreSQL per una serie di motivi interni relativi alla sua sessione e al modello di processo.

Per ora, usa dblink come suggerito da Bob.

Per Postgresql 9.5 o successivo è ansible utilizzare gli operatori in background dinamici forniti dall’estensione pg_background. Crea una transazione autonoma. Per favore, fai riferimento alla pagina github dell’estensione. La soluzione è migliore di db_link. Esiste una guida completa sul supporto delle transazioni autonome in PostgreSQL . C’è un terzo modo per avviare una transazione autonoma in Postgres, ma alcune necessità di patch. Si prega di consultare la proposta di patch Eisentraut di Peter per le transazioni in stile OracleDB.