[pgsql-jp: 39068] Re: 複数テーブルからの検索結果を、複数行列返す関数

NASUNO Isao isao.nasuno @ ctc-g.co.jp
2008年 1月 25日 (金) 13:45:44 JST


那須野です。

早速のご教授、ありがとうございます。

> 関数を呼ぶときに、SELECT functest() ではなく、
> SELECT * FROM functest() にしてみてはいかがでしょうか?

OUT引数というのを使って再定義したら、期待した結果を得ることができました。

なのですが、ここでは、たとえば、

select functest(id) from
(select header.id from header,target where 絞込み条件) alias;

のような使い方をしたくて select functest() の形式を実現したかったのです。

select * from functest(
(select header.id from header,target where 絞込み条件)
);
という感じに出来ればいいのですが、やり方が分かりません(出来ない気がします)。
これに近い文法はないでしょうか?

どうぞよろしくお願いします。


ITAGAKI Takahiro wrote:
> NASUNO Isao <isao.nasuno @ ctc-g.co.jp> wrote:
> 
>> id      key
>> ------------
>>  1      aaaaaa bbbbbbb
>>  2      cccccc ddddddd
>>
>> というように返したいのですが、これは、
>>
>>     functest
>> ----------------------
>>  (1,"aaaaaa bbbbbb")
>>
>> のようになってしまいました。
> 
> 関数を呼ぶときに、SELECT functest() ではなく、
> SELECT * FROM functest() にしてみてはいかがでしょうか?
> 
> 
> あと、おまけですが、OUT 引数を使うと記述が楽になるかもしれません。
> 
> -- テーブル定義
> CREATE TABLE header (id integer, targetid integer);
> CREATE TABLE target (id integer, name text, descript text);
> 
> -- テーブル関数
> create function functest(id integer,
>    OUT id integer,
>    OUT key text)
> returns setof record
> as
> '
> select
>   header.id, target.name||'' ''||target.descript as key
> from
>   header,
>   target
> where
>   header.id=$1 and header.targetid=target.id
> '
> language 'sql'
> ;
> 
> -- テスト
> =# INSERT INTO target VALUES
>     (1, 'aaaaaa', 'bbbbbbb'), (2, 'cccccc', 'ddddddd');
> =# INSERT INTO header VALUES(1, 1), (1, 2);
> =# SELECT * FROM functest(1);
>  id |       key
> ----+-----------------
>   1 | aaaaaa bbbbbbb
>   1 | cccccc ddddddd
> (2 rows)
> 





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