2012-04-14 15 views
2

私は動的にSELECTを生成しました。私は結果をSETOF RECORDとして返そうとします。Postgres 9.1 SETOFレコードのタイプ

CREATE FUNCTION test(column_name text) RETURNS SETOF RECORD AS $$ 
DECLARE 
    row RECORD; 
BEGIN 
    FOR row IN EXECUTE 'SELECT ' || quote_ident(column_name) || ' FROM dates' 
LOOP 
    RETURN NEXT row; 
END LOOP; 
RETURN; 
END; 
$$ LANGUAGE 'plpgsql'; 

私は試してみてください:そのようなSTH

SELECT * FROM test('column1'); 

私はこれを取得:

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

私はカラム1が整数型であることを知っている:

SELECT * FROM test('column1') f(a int); 

結果はこれはInteger typとなることがわかっているからですe。

私は試してみてください。

SELECT * FROM test('column1') f(a varchar); 

私はエラーを取得する:

ERROR: wrong record type supplied in RETURN NEXT 
DETAIL: Returned type integer does not match expected type character varying in column 1. 

今、私の質問: 私はタイプF」(int型を定義QUERTYの一部を取り除くために何をします) '。 Postgresは何が返されるかを知っているので、実行可能でなければなりません。 IMMUTABLEオプションを試しましたが、失敗しました。

+0

はどのように最初の ''でint'ことができcolumn1'例と2番目の例で 'varchar'ですか? –

+0

それはありませんが、私はポストグルが返品の種類を知っていることを示したかったのです。 – zie1ony

+1

あなたがしていることは、 'select column1 from dates'とまったく同じようです。テーブルから1つの列だけを返す関数が必要なのはなぜですか?あなたが解決しようとしている問題は何ですか? –

答えて

5

関数内のテキストに値をキャストし、関数RETURNS SETOF textを宣言することができます。一度に結果セット全体を返すこともできます。明示的に反復する必要はありません。今

CREATE TABLE dates (column1 int, column2 date); 
INSERT INTO dates VALUES (1, date '2012-12-22'), (2, date '2013-01-01'); 

CREATE FUNCTION test(column_name text) RETURNS SETOF text AS $$ 
BEGIN 
    RETURN QUERY EXECUTE 'SELECT ' 
     || quote_ident(column_name) || '::text FROM dates'; 
END; 
$$ LANGUAGE 'plpgsql'; 

SELECT test('column1');利回り:(私のロケール設定を持つ)

test 
------ 
1 
2 
(2 rows) 

...とSELECT test('column2');利回り:

test  
------------ 
2012-12-22 
2013-01-01 
(2 rows) 
+1

ありがとう、非常に:) – zie1ony

0

戻す列に対応するOUTパラメータを指定する必要があります。

+0

これは 'RETURN SETOF RECORD'では必要ではない –

+0

しかし、何個のパラメータを返すのか分かりません。 – zie1ony

関連する問題