1

ECPG(CのEmbedded SQL)を使用して、カーソルを使用してテーブルから行をフェッチしようとしています。

例えば:

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

しかし、テーブルテストに対応するstruct test_structを定義する必要があるようです。つまり、テーブル内の列の数とそのタイプおよび名前をすでに知っているということです。スキーマを知らなかったテーブルから行をフェッチするにはどうすればよいですか?

例えば:

select * from arbitrary_table_in_my_db

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

///変更:SQLDAは正常に機能します。これは、 http://www.postgresql.org/message-id/4C206CD8.7050801@gmail.comのサンプルコードです。

//いくつかの変更を加えました

#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);
} 
4

1 に答える 1

1

結果セットに関する情報を取得するには、SQLDA(SQL記述子領域)構造を使用する必要があります。

このように記述子を使用する場合は、次のようなステートメントを実行してSELECT *から、SQLDA構造体を使用して、実際に返される内容の詳細を確認できます。

SQLDAドキュメント(Postgresql 9.1)

于 2013-02-27T01:23:36.623 に答える