2013-02-26 68 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)

相關問題