更新时间:2024-05-07 GMT+08:00

执行带有结果集的语句

执行具有单独结果集的SQL语句,可以使用EXECUTE。若要保存结果,则增加INTO子句。示例如下:
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;

EXECUTE命令支持INTO子句和USING子句。

如果一个查询可能返回多个结果行,则应使用游标,游标详情请参见使用游标章节,示例如下:
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;