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

abe_i abe_i @ yamagishi.or.jp
2005年 7月 8日 (金) 00:10:37 JST


阿部です。

改めて関数を拝見させてもらいました。

やりたいことは、条件に該当するninusi_master の件数の取得と
条件に該当するデータの intfirst 番目から 20件のデータを取得する事
という理解で話を進めさせてもらいます。

関数にするかは別にして、私であれば以下のようなsqlにします。

1.該当件数の取得

  select count(*) from ninusi_master where ......

2.該当データの取得

  select ninusi_code, furi ..... from ninusi_master where ...... 
    order by ninusi_code offset intfirst limit 20

(intfirstが1から始まるのであれば-1する必要あり)

私の関数の解釈が違っていたらごめんなさい。

ではでは。

> --------------------------------------------------
> 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"以降のテーブル名と返されるレコードのテーブル名が違いました。 
> 
> やはり、レコードの行数だけを返す関数をひとつ作ったほうがよろしいのでしょうか? 
> 
> 何か良い案があれば、よろしくお願いします。
> 

-- 
阿部 <abe_i @ yamagishi.or.jp>




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