9

私はそれを理解しようとしてかなりの時間を費やしましたが、解決できませんでした。だから、私はあなたの助けが必要です。

複数の行を返す PL/pgSQL 関数を作成しようとしています。私が書いた関数を以下に示します。しかし、それは機能していません。

CREATE OR REPLACE FUNCTION get_object_fields()
RETURNS SETOF RECORD
AS 
$$
DECLARE result_record keyMetrics;
BEGIN
    return QUERY SELECT department_id into result_record.visits 
    from fact_department_daily 
    where report_date='2013-06-07';
    --return result_record;
END

$$ LANGUAGE plpgsql; 

SELECT * FROM get_object_fields;

このエラーを返しています:

エラー: RETURN は、セットを返す関数にパラメーターを持つことはできません。
「QUERY」またはその近くで RETURN NEXT を使用する

4

3 に答える 3

16

@Pavelが指摘したバグを修正した後、戻り値の型も適切に定義するか、すべての呼び出しで列定義リストを提供する必要があります。

この呼び出し:

SELECT * FROM get_object_fields()

... Postgres が展開方法を知っていることを前提としています*。匿名のレコードを返すため、例外が発生します。

ERROR:  a column definition list is required for functions returning "record"

これを修正する (いくつかの) 方法の 1 つは、RETURNS TABLE(Postgres 8.4+)を使用することです。

CREATE OR REPLACE FUNCTION get_object_fields()
  RETURNS TABLE (department_id int) AS 
$func$
BEGIN
   RETURN QUERY
   SELECT department_id
   FROM   fact_department_daily 
   WHERE  report_date = '2013-06-07';
END
$func$ LANGUAGE plpgsql;

SQL 関数でも同じように機能します。

関連している:

于 2013-06-24T17:30:28.697 に答える
0

ここに1つの方法があります

drop function if exists get_test_type();

drop type if exists test_comp;
drop type if exists test_type;
drop type if exists test_person;

create type test_type as (
  foo int, 
  bar int
);

create type test_person as (
  first_name text, 
  last_name text
);

create type test_comp as 
(
  prop_a test_type[], 
  prop_b test_person[]
);


create or replace function get_test_type()
returns test_comp
as $$
declare
  a test_type[];
  b test_person[];
  x test_comp;
begin

  a := array(
    select row (m.message_id, m.message_id) 
    from message m
  );

  -- alternative 'strongly typed'
  b := array[
    row('Bob', 'Jones')::test_person,
    row('Mike', 'Reid')::test_person
  ]::test_person[];

  -- alternative 'loosely typed'
  b := array[
    row('Bob', 'Jones'),
    row('Mike', 'Reid')
  ];

  -- using a select
  b := array (
    select row ('Jake', 'Scott')
    union all 
    select row ('Suraksha', 'Setty')
  );  

  x := row(a, b);

  return x;  
end;
$$
language 'plpgsql' stable;


select * from get_test_type();
于 2016-07-12T00:24:54.037 に答える