commit within a procedure loop - cannot commite with subtransaction
Hi,
Using a procedure for the first time to run some processing for each row in
a table, generating output to a target table. The following works without
COMMIT the example below gives:
INFO: Error Name:cannot commit while a subtransaction is active
INFO: Error State:2D000
Could someone point me in the right direction so i can understand why and
how i might rework my methodology?
CREATE OR REPLACE PROCEDURE my_functions.first_procedure(
)
LANGUAGE 'plpgsql'
AS $BODY$
DECLARE
grd_geom geometry(Polygon,27700);
grd_gid integer;
rec data.areas%rowtype;
BEGIN
DELETE FROM data.output;
DELETE FROM data.temp_output;
FOR rec IN SELECT * FROM data.areas
LOOP
grd_geom := rec.geom;
grd_gid := rec.gid;
PERFORM my_functions.processing_function(grd_geom);
DELETE FROM data.temp_output;
COMMIT;
END LOOP;
RETURN;
END;
$BODY$;
GRANT EXECUTE ON PROCEDURE my_functions.first_procedure() TO postgres;
GRANT EXECUTE ON PROCEDURE my_functions.first_procedure() TO PUBLIC;
Thanks
Andy
--
Sent from: http://www.postgresql-archive.org/PostgreSQL-general-f1843780.html
On 1/21/19 4:43 AM, andyterry wrote:
Hi,
Using a procedure for the first time to run some processing for each row in
a table, generating output to a target table. The following works without
COMMIT the example below gives:INFO: Error Name:cannot commit while a subtransaction is active
INFO: Error State:2D000Could someone point me in the right direction so i can understand why and
how i might rework my methodology?
1) This is Postgres 11, correct?
2) I have to believe the issue is the:
PERFORM my_functions.processing_function(grd_geom);
https://www.postgresql.org/docs/11/plpgsql-transactions.html
"...But if the call stack is CALL proc1() → SELECT func2() → CALL
proc3(), then the last procedure cannot do transaction control, because
of the SELECT in between."
3) What is my_functions.processing_function() doing?
CREATE OR REPLACE PROCEDURE my_functions.first_procedure(
)
LANGUAGE 'plpgsql'AS $BODY$
DECLARE
grd_geom geometry(Polygon,27700);
grd_gid integer;
rec data.areas%rowtype;BEGIN
DELETE FROM data.output;
DELETE FROM data.temp_output;FOR rec IN SELECT * FROM data.areas
LOOP
grd_geom := rec.geom;
grd_gid := rec.gid;PERFORM my_functions.processing_function(grd_geom);
DELETE FROM data.temp_output;
COMMIT;
END LOOP;
RETURN;END;
$BODY$;
GRANT EXECUTE ON PROCEDURE my_functions.first_procedure() TO postgres;
GRANT EXECUTE ON PROCEDURE my_functions.first_procedure() TO PUBLIC;Thanks
Andy
--
Sent from: http://www.postgresql-archive.org/PostgreSQL-general-f1843780.html
--
Adrian Klaver
adrian.klaver@aklaver.com
"andyterry" == andyterry <andrew.terry@centremaps.co.uk> writes:
andyterry> Hi,
andyterry> Using a procedure for the first time to run some processing
andyterry> for each row in a table, generating output to a target
andyterry> table. The following works without COMMIT the example below
andyterry> gives:
andyterry> INFO: Error Name:cannot commit while a subtransaction is active
andyterry> INFO: Error State:2D000
What client are you using to execute this? Some clients may insert
SAVEPOINT statements (which create subtransactions) behind your back
(e.g. psql with \set ON_ERROR_ROLLBACK does this) in order to recover
from errors without aborting the whole transaction.
(turn on log_statement=all in your config, or for the user you're
executing this as, and look for the command in the server log)
--
Andrew (irc:RhodiumToad)
Thanks Adrian,
It is PostgreSQL 11.
The procedure listed is calling one postgres function which is in turn
calling another postgres function but no additional procedure, just
functions.
It's a bit lengthy to explain what the functions are doing so i'll try
testing with a less complex task i think so i can narrow things down.
Appreciate your response
Andy
--
Sent from: http://www.postgresql-archive.org/PostgreSQL-general-f1843780.html
Thanks Andrew,
The database is currently chewing through the load (without commits) as i'm
doing a batch of rows at a time.
I'm calling the procedure in pgadmin (4-4.2) as i was testing some bits from
there but i'll also try a psql run
Appreciate the pointers, Andy
--
Sent from: http://www.postgresql-archive.org/PostgreSQL-general-f1843780.html