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 回答