3

SELECT を動的に生成しました。結果を SETOF RECORD として返すようにしています。そのようなもの:

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';

私がしようとすると:

SELECT * FROM test('column1');

私はこれを得る:

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

column1 が整数型であることはわかっています。

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

これは整数型になることがわかっているため、結果は正しいです。

私がしようとすると:

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(a int)' を定義するクエリの一部を取り除くにはどうすればよいですか。Postgresは返される型を知っているので、それは実現可能です。IMMUTABLE オプションを試してみましたが、うまくいきませんでした。

4

2 に答える 2

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)
于 2012-04-14T13:56:59.693 に答える
0

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

于 2012-04-14T13:15:58.927 に答える