Re: Problem close curser after rollback - Mailing list pgsql-general

From Matthias Apitz
Subject Re: Problem close curser after rollback
Date
Msg-id 20201001063655.GB1813@r314251-amd64
Whole thread Raw
In response to Re: Problem close curser after rollback  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-general
El día miércoles, septiembre 30, 2020 a las 02:37:23p. m. -0400, Tom Lane escribió:

> Matthias Apitz <guru@unixarea.de> writes:
> > El día miércoles, septiembre 30, 2020 a las 05:26:39p. m. +0200, Laurenz Albe escribió:
> >> On Wed, 2020-09-30 at 13:32 +0000, Wiltsch,Sigrid wrote:
> >>> What can I do so that the cursor is retained despite rollback?
> 
> >> You cannot start a transaction while you are reading a cursor; you probably
> >> get a warning "there is already a transaction in progress".
> 
> > I think we will prepare the ten-liner in ESQL/C for further discussion.
> 
> I don't think you really need to: the point seems clear enough.

I did wrote the ten-liner to play around with. Interestingly, there exists an
undocumented ESQL/C statement 'EXEC SQL START TRANSACTION' which gives
in the esqlc log:

ECPGtrans on line 48: action "start transaction"; connection "sisis"

What as well does work is the following sequence:

        EXEC SQL PREPARE stmt1 FROM "SELECT tstchar25, tstint FROM dbctest WHERE tstint > ?";
        EXEC SQL DECLARE foo_bar CURSOR WITH HOLD  FOR stmt1 ;

        /* when end of result set reached, break out of while loop */
        EXEC SQL WHENEVER NOT FOUND DO BREAK;

        EXEC SQL OPEN foo_bar USING 1;

        while (1)
        {
                EXEC SQL FETCH NEXT FROM foo_bar INTO :tstchar25, :tstint;

                EXEC SQL COMMIT ;

                EXEC SQL START TRANSACTION ;
                printf("fetched: [%s] [%d] \n", tstchar25, tstint);

        // ... do something with the fetched data and because
        // it went wrong, we issue a ROLLBACK

                EXEC SQL ROLLBACK ;
        }

This fetches nicely through the table in the while-loop; without the
additional COMMIT, the START TRANSACTION gives

ECPGtrans on line 48: action "start transaction"; connection "sisis"
ECPGnoticeReceiver: there is already a transaction in progress

We will think now about what we have learned and how to repair our
application.

    matthias

-- 
Matthias Apitz, ✉ guru@unixarea.de, http://www.unixarea.de/ +49-176-38902045
Public GnuPG key: http://www.unixarea.de/key.pub
Без книги нет знания, без знания нет коммунизма (Влaдимир Ильич Ленин)
Without books no knowledge - without knowledge no communism (Vladimir Ilyich Lenin)
Sin libros no hay saber - sin saber no hay comunismo. (Vladimir Ilich Lenin)



pgsql-general by date:

Previous
From: Ron
Date:
Subject: Re: Restoring a database problem
Next
From: Alban Hertroys
Date:
Subject: FATAL: terminating connection due to administrator command