Thread: ECPG cursor examples should include EXEC SQL WHENEVER NOT FOUND CONTINUE; after the while loop
ECPG cursor examples should include EXEC SQL WHENEVER NOT FOUND CONTINUE; after the while loop
From
PG Doc comments form
Date:
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;
Re: ECPG cursor examples should include EXEC SQL WHENEVER NOT FOUND CONTINUE; after the while loop
From
Bruce Momjian
Date:
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.