関数は戻り型を宣言する必要があります。配列は、よく知られている要素タイプにのみ基づくことができます。匿名の記録は許可されていません。したがって、ニーズに合った複合型を作成します(行型をすでに定義しているテーブルまたはビューがない場合)。
CREATE TYPE my_type (
ts text
, alertlevel int
, time_passed interval
);
テストの目的で、セッション中に複合型を登録するための一時テーブルを作成することもできます。
CREATE TEMP TABLE my_type ( ...)
(セッションの終了時に一時テーブルが削除され、その型に基づいて構築された関数はその後壊れます。)
それを配列の基本型として使用します。目的のために単純なSQL関数を使用できます:
CREATE OR REPLACE FUNCTION foo()
RETURNS my_type[] AS
$func$
SELECT array_agg(result::my_type) -- you must cast the row type!
FROM (
SELECT to_char("Timestamp", 'YYYY-MM-DD HH24:MI:SS')
, "AlertLevel"
, "Timestamp" - lag("Timestamp") OVER (ORDER BY "Timestamp")
FROM "Judgements"
WHERE "SampleID" = sampleid
AND "Timestamp" >= starttime
AND "Timestamp" <= stoptime
) result
WHERE "AlertLevel" > 0;
$func$
LANGUAGE sql;
電話:
SELECT foo();
text []
を使用した単純な代替手段
text
にキャストすることもできます /テキスト[]コード> 。列名とタイプ情報は失われますが、そのままで機能します:
CREATE OR REPLACE FUNCTION foo()
RETURNS text[] AS
$func$
SELECT array_agg(result::text) -- cast the record to text!
FROM ( ... ) result
...;
$func$
LANGUAGE sql;
実際に配列が必要ない場合は、 array_agg()
を廃棄できます。 、個々の行を返し、 RETURNS TABLE(...)
を使用して戻りタイプを宣言します。 。 SOで
次のコマンドで集合を返す関数を呼び出すことを忘れないでください:
SELECT * FROM foo();