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

Tetsuya Kakura kakura @ saki.netwk.ntt-at.co.jp
2002年 3月 28日 (木) 09:47:27 JST


こんにちは。
加倉です。

Tetsuya Kakura wrote on Wed, 27 Mar 2002 13:16:09 +0900

> > > Q2. Q1 が無理な場合、Fig.1 の方法以外で任意の select 文の列の定義を取
> > >   得する方法はありませんでしょうか。
> > 
> > select... from... where false
> > 
> > ではいかがでしょう?結果は0行ですが定義情報は返ります。
> 
> なるほど!
> psql で試したところうまく出来そうでした。
> プログラムに組み込んでみます。

この件の事後報告です。

select 文に where false を追加し、定義情報取得時に行を取得しないようにす
ることで、select 文中の式の評価を行わないようになりました。

 このとき注意しなければならないのは、where, group by, for updata, union,
intersect, except, order by, having およびサブクエリが含まれている場合に
where false を適切な場所に挿入しなければならないということで、独自に
select 文を解析する必要があったということです。
 基本的には from 区の後ろに入れればよいだけですが、from には複数のテー
ブル名や as などが含まれる場合があり、from 区がどこまであるかの解析より
も、from の後ろの区を探すほうが簡単そうだったので、from の後ろの区を探し
その直前に where false を挿入するようにしました。

 この方法だと、今後 select 文の文法が変更・拡張された場合には独自解析部
を作り直す必要があるのが気になるところではあります。

谷田さん、where false を追加するアイデアありがとうございました。

※追伸
 当初の目的は達成しましたが、オリジナルの SQL 文を無変更で、行取得なし
に SELECT 文で選択する各列の情報(型,名前,サイズ,制約など)を取得する方法
は随時募集中(?)です。ご存知のかたがいらっしゃいましたら教えてください。
お願いします。(もちろん自分でも調べます)

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



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