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);
}
這可能是有趣的;它討論瞭如何讀取任意的'RECORD'結果。 http://www.postgresql.org/message-id/[email protected] – 2013-02-27 00:12:08
謝謝克雷格。但它仍然定義了一個特定的結構來存儲提取結果,我的問題是:是否有可能獲取一行到泛型結構? – camino 2013-02-27 00:33:48
@caminio我不使用ECPG,但通常在Pg中,您希望將該行轉換爲'xml','json'或'hstore'服務器端,並將其作爲單個字段返回。 – 2013-02-27 01:23:30