ECPG cursor examples should include EXEC SQL WHENEVER NOT FOUND CONTINUE; after the while loop

Started by PG Bug reporting formalmost 5 years ago2 messagesdocs
Jump to latest
#1PG Bug reporting form
noreply@postgresql.org

The following documentation comment has been logged on the website:

Page: https://www.postgresql.org/docs/13/ecpg-variables.html
Description:

Without this line:
EXEC SQL WHENEVER NOT FOUND CONTINUE;
after the while(1), I find that ECPG CURSOR examples fail.

For example, this example under 36.4.4.3.2. Structures fails:

EXEC SQL BEGIN DECLARE SECTION;
typedef struct
{
int oid;
char datname[65];
long long int size;
} dbinfo_t;

dbinfo_t dbval;
EXEC SQL END DECLARE SECTION;

memset(&dbval, 0, sizeof(dbinfo_t));

EXEC SQL DECLARE cur1 CURSOR FOR SELECT oid, datname,
pg_database_size(oid) AS size FROM pg_database;
EXEC SQL OPEN cur1;

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

while (1)
{
/* Fetch multiple columns into one structure. */
EXEC SQL FETCH FROM cur1 INTO :dbval;

/* Print members of the structure. */
printf("oid=%d, datname=%s, size=%lld\n", dbval.oid, dbval.datname,
dbval.size);
}

EXEC SQL CLOSE cur1;

#2Bruce Momjian
bruce@momjian.us
In reply to: PG Bug reporting form (#1)
Re: ECPG cursor examples should include EXEC SQL WHENEVER NOT FOUND CONTINUE; after the while loop

On Sat, Jul 3, 2021 at 11:54:11AM +0000, PG Doc comments form wrote:

The following documentation comment has been logged on the website:

Page: https://www.postgresql.org/docs/13/ecpg-variables.html
Description:

Without this line:
EXEC SQL WHENEVER NOT FOUND CONTINUE;
after the while(1), I find that ECPG CURSOR examples fail.

For example, this example under 36.4.4.3.2. Structures fails:

Uh, can you give me full C example to test? I already see EXEC SQL
WHENEVER NOT FOUND DO BREAK in the sample code, so I don't see how
CONTINUE would actually work, since it would just loop over the result
infinitely.

---------------------------------------------------------------------------

EXEC SQL BEGIN DECLARE SECTION;
typedef struct
{
int oid;
char datname[65];
long long int size;
} dbinfo_t;

dbinfo_t dbval;
EXEC SQL END DECLARE SECTION;

memset(&dbval, 0, sizeof(dbinfo_t));

EXEC SQL DECLARE cur1 CURSOR FOR SELECT oid, datname,
pg_database_size(oid) AS size FROM pg_database;
EXEC SQL OPEN cur1;

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

while (1)
{
/* Fetch multiple columns into one structure. */
EXEC SQL FETCH FROM cur1 INTO :dbval;

/* Print members of the structure. */
printf("oid=%d, datname=%s, size=%lld\n", dbval.oid, dbval.datname,
dbval.size);
}

EXEC SQL CLOSE cur1;

--
Bruce Momjian <bruce@momjian.us> https://momjian.us
EDB https://enterprisedb.com

If only the physical world exists, free will is an illusion.