Updated on 2024-05-07 GMT+08:00

Executing a Statement with a Result Set

EXECUTE can be used to execute SQL statements with a result set. To save the result, add an INTO clause. Example:
EXEC SQL BEGIN DECLARE SECTION;
    const char *stmt = "SELECT a, b, c FROM test1 WHERE a > ?";
    int v1, v2;
    VARCHAR v3[50];
EXEC SQL END DECLARE SECTION;

    EXEC SQL PREPARE mystmt FROM :stmt;
    ...
    EXEC SQL EXECUTE mystmt INTO :v1, :v2, :v3 USING 37;

The EXECUTE statement supports the INTO and USING clauses.

If a query may return multiple result rows, use cursors. For details about cursors, see Using Cursors. Example:
EXEC SQL BEGIN DECLARE SECTION; 
    char dbaname[128]; 
    char datname[128]; 
    char *stmt = "SELECT u.usename as dbaname, d.datname "      
                 "  FROM pg_database d, pg_user u "     
                 "  WHERE d.datdba = u.usesysid"; 
EXEC SQL END DECLARE SECTION;  

    EXEC SQL CONNECT TO testdb AS con1 USER testuser;  

    EXEC SQL PREPARE stmt1 FROM :stmt;  

    EXEC SQL DECLARE cursor1 CURSOR FOR stmt1; 
    EXEC SQL OPEN cursor1;  

    EXEC SQL WHENEVER NOT FOUND DO BREAK;  

    while (1) 
    {     
        EXEC SQL FETCH cursor1 INTO :dbaname,:datname;
        printf("dbaname=%s, datname=%s\n", dbaname, datname); 
    }  
    EXEC SQL CLOSE cursor1;  

    EXEC SQL COMMIT; 
    EXEC SQL DISCONNECT ALL;