0

型指定されていない行の値を返すことができる postgres 関数を定義する方法を探しています。議論のために、次のテーブルが存在すると仮定します。

create table foo(
  id serial primary key,
  value1 varchar(255),
  value2 int,
  value3 datetime,
  value4 boolean
);

また、一部の列の結果を返すことができる関数もあります (これはやや不自然な例ですが、実際には内部で多くの結合が発生するため、関連する列のみを使用して最小限に抑えたいと考えています)。

create or replace function foo_func(col1 text, col2 text) returns 
  table(?, ?) as 
$$
declare 
sql text;
begin
  sql := 'select ' || col1 || ', ' || col2 || ' from foo'
  return execute sql;
end
$$ language plpgsql;

列の値は選択した列引数に依存するため、戻りテーブルを前もって定義することはできません。値を指定せずに行を返す方法はありますか? 代わりにカーソルを返すことを検討しましたが、これが最適なオプションかどうかはわかりません。

(postgresql のバージョンを定義できます)

4

1 に答える 1

1

戻る必要がありますsetof record( ref )。

create or replace function foo_func(col1 text, col2 text) returns 
  setof record as 
$$
declare 
sql text;
r record;
begin
  sql := 'select ' || col1 || ', ' || col2 || ' from foo';
  for r in execute sql
  loop
    return next r;
  end loop;
  return;
end
$$ language plpgsql;

問題は、関数の外側で列の型を宣言する必要があることです。

SELECT * from foo_func('value1','value2') as (a varchar(255),b int);

宣言が一致しない場合、エラーが発生します: http://sqlfiddle.com/#!12/ce8b0/3

于 2013-04-24T08:42:51.493 に答える