[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 メーリングリストの案内