[pgsql-jp: 25416] FETCH せずに select 文の各列の属性を取得したい

Tetsuya Kakura kakura @ saki.netwk.ntt-at.co.jp
2002年 3月 27日 (水) 09:55:48 JST


はじめまして。
加倉と申します。

TurboLinux 6.5J 上の PostgreSQL 7.1.3 で libpq を使って Fig.1 の
様なプログラムしています。(実際のプログラムのロジックのみを引き継
いで整理してあります。)

任意の select 文の各列の定義(名前・型・サイズ・精度など)を取得する
のが Fig.1 のプログラムの目的です。

■質問
Q1. Fig.1 のプログラムで select 文中に式があっても評価されないように
  する方法はありませんでしょうか。
- FETCH 1 をしていますので、必ず一行分の FETCH を行ってしまい、select
 文中の nextval('seq_name') が評価され seq_name がカウントアップされ
 てしまいます。列の定義を取得したいだけなので式の評価がなされないよ
 うにしたいのです。
- ちなみに PostgreSQL 7.1.3 で FETCH 0 は FETCH ALL の意味になってしま
 うので列の評価は発生して今いました。

Q2. Q1 が無理な場合、Fig.1 の方法以外で任意の select 文の列の定義を取
  得する方法はありませんでしょうか。
- 純粋に table 定義ならシステムカタログを見るという方法もあると思いま
 すが、as を使った列の別名や、式を使った仮想的な列をもつ select 文の
 場合に対応できない(ですよね?)と思いますので Fig.1 のようなプログラ
 ムにしています。

【Fig.1】--- ここから -----------------------------------------------------
 1: //  select 文でカーソル cursorname を宣言する
 2: PGresult* result = PQexec(cnn, "DECLARE cursorname CURSOR FOR select nextval('seq_name') as seq from seq_name");
 3: PQclear(result);
 4:
 5: // 列の定義を取得するために FETCH する。
 6: result = PQexec(cnn, "FETCH 1 in cursorname");
 7:
 8: // 列数を取得
 9: int numclms = PQnfields(result);
10:
11: // 各列の型・サイズ・精度などを取得する
12: for (int clm = 0; clm  < numclms; clm++) {
13:    Oid ftype = PQftype(result, clm);
14:    int fmod = PQfmod(result, clm);
15:     char* column_name = PQfname(result, clm);
16:
17:    // ここに列の定義を保管するコードがあります。
18: }
19: PQclear(result);
20:
21: // カーソルを閉じる
22: result = PQexec(cnn, "CLOSE cursorname");
23:  PQclear(result);
【Fig.1】--- ここまで -----------------------------------------------------

ご存知の方がいらっしゃいましたら宜しくお願いします。

--
Tetsuya Kakura / kakura @ saki.netwk.ntt-at.co.jp



pgsql-jp メーリングリストの案内