Postgres 9.1 SETOF记录的类型

时间:2012-04-14 13:05:23

标签: postgresql types record

我动态生成了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);

结果是正确的,因为我知道这将是Integer类型。

当我尝试:

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选项,但没有成功。

2 个答案:

答案 0 :(得分: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 :(得分:0)

您需要指定与要返回的列对应的OUT参数。