2013-02-26 39 views
1

我想在C中使用ECPG - 嵌入式SQL - 使用游标从表格中获取一行。postgresql在不知道表格详细信息的情况下获取一行

例如:

struct{ 
    char *col1; 
    char *col2; 
    .... 

}test_struct; 

EXEC SQL DECLARE mycursor CURSOR FOR select * from test 
EXEC SQL SET TRANSCATION read only 
EXEC SQL OPEN mycursor 
EXEC SQL FETCH FROM mycursor INTO :test_struct 

但似乎我必须定义对应表测试一个结构test_struct,这意味着我已经知道如何在表中的列以及其类型和名称。如何从任何我不知道其模式的表中获取一行?

例如:

select * from arbitrary_table_in_my_db 

//////////////////////////////////// /////////////////////

///修改: SQLDA正常工作,这里是从http://www.postgresql.org/message-id/[email protected]

示例代码//取得了一些修改

#include <pgtypes_date.h> 
#include <pgtypes_numeric.h> 
EXEC SQL include sqlda.h; 

sqlda_t   *sqlda1; 

int 
main(void) 
{ 
     EXEC SQL CONNECT TO .... 


     EXEC SQL DECLARE cur CURSOR FOR SELECT * FROM test; 
     EXEC SQL OPEN cur; 

     EXEC SQL WHENEVER NOT FOUND DO BREAK; 

     while (1) { 
       /* Open a cursor and assign descriptor to the cursor */ 
       EXEC SQL FETCH NEXT FROM cur INTO DESCRIPTOR sqlda1; 

       while (1) { 
        int i; 
        char name_buf[1024]; 
        char var_buf[1024]; 

        for (i=0 ; i<sqlda1->sqld ; i++) { 
        sqlvar_t v = sqlda1->sqlvar[i]; 
        char *sqldata = v.sqldata; 
        short sqllen = v.sqllen; 

        strncpy(name_buf, v.sqlname.data, v.sqlname.length); 
        name_buf[v.sqlname.length] = '\0'; 

        strncpy(var_buf, sqldata, sqllen); 

        var_buf[sqllen] = '\0'; 


        if(v.sqltype == 16) 
         printf("%s = %s, (type:%d)\n", name_buf, PGTYPESnumeric_to_asc((numeric*)sqldata,0), v.sqltype); 
        else if(v.sqltype == 18){ 
         printf("%s = %s, (type:%d)\n", name_buf, PGTYPESdate_to_asc(*v.sqldata), v.sqltype); 
        } 
        else 
         printf("%s = %s, (type:%d)\n", name_buf, var_buf, v.sqltype); 
        } 
        printf("\n"); 

        if (sqlda1->desc_next==NULL) 
        break; 
       } 
     } 
     EXEC SQL CLOSE cur; 
     EXEC SQL COMMIT; 
     EXEC SQL DISCONNECT ALL; 
     return (0); 
} 
+0

这可能是有趣的;它讨论了如何读取任意的'RECORD'结果。 http://www.postgresql.org/message-id/[email protected] – 2013-02-27 00:12:08

+0

谢谢克雷格。但它仍然定义了一个特定的结构来存储提取结果,我的问题是:是否有可能获取一行到泛型结构? – camino 2013-02-27 00:33:48

+0

@caminio我不使用ECPG,但通常在Pg中,您希望将该行转换为'xml','json'或'hstore'服务器端,并将其作为单个字段返回。 – 2013-02-27 01:23:30

回答

1

您需要使用SQLDA(SQL描述符区域)结构来检索有关结果集的信息。

以这种方式使用描述符时,可以执行类似SELECT *之类的语句,然后使用SQLDA结构查找实际返回内容的详细信息。

SQLDA documentation (Postgresql 9.1)

相关问题