我动态生成了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选项,但没有成功。
答案 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参数。