[pgsql-jp: 35699] Re: RETURNの戻り値をレコードセットと一緒に受取る

Koyama Manabu sm-bunbun-ll @ mx9.tiki.ne.jp
2005年 7月 7日 (木) 20:49:12 JST


小山といいます。
阿部さんご回答ありがとうございました。

> 1.setof を使用した場合、最後のreturnは引数なしのreturnを使うのでは?
知りませんでした。

> 2.$resはobjectですから、countしても意味はないので、行数を知りたいので
>   あればnumRows()を使えばいいですし、知りたい行数がこの関数が返す行数
>   と違うのであれば、その行数を最後のデータの一部として返すとかの細工が
>   必要だと思います。
この回答からヒントを得て、一時テーブルに行数の合計を挿入する列を作成して
一時テーブルの結果を返そうとしましたが、そんなことは無茶だと分かりました。
--------------------------------------------------
create or replace function nmaster_func3(text,integer) returns setof 
ninusi_mastert as '
<略>
int_var integer;
begin
--シーケンスの設定
create temp sequence mas_seq start 1;
--一時テーブル作成
create temp table pro_t(
 row_id integer default nextval(''mas_seq''),
 proid integer
 );

sql:=''insert into pro_t(proid)
 select ninusi_code from ninusi_mastert where '' || jouken;
execute sql;

--結果セットの取得
GET DIAGNOSTICS int_var=ROW_COUNT;

--最初と最後の作成
intfirst:=((curentpage-1) * 20) +1;
intlast:=curentpage * 20;

create temp table all_data(
 n_code integer,
 huri text,
 yubin text,
 n_name  text,
 basyo text,
 tel_no text,
 int_row integer
 );

sql2:=''insert into all_data(n_code,huri,yubin,n_name,basyo,tel_no,int_row)
 select ninusi_code,hurigana,yubinbango,ninusi_name,jusyo,tel,int_var from 
ninusi_mastert
 where ninusi_code in(select proid from pro_t where row_id between '' || 
intfirst || '' and '' || intlast || '')'';
execute sql2;

sql3:=''select * from all_data'';

for rec in execute sql3 loop
 return next rec;
 end loop;
return;
end;
' language plpgsql;
--------------------------------------------------
よく考えたら"setof"以降のテーブル名と返されるレコードのテーブル名が違いました。 

やはり、レコードの行数だけを返す関数をひとつ作ったほうがよろしいのでしょうか? 

何か良い案があれば、よろしくお願いします。





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