zie*_*ony 2 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';
Run Code Online (Sandbox Code Playgroud)
当我尝试:
SELECT * FROM test('column1');
Run Code Online (Sandbox Code Playgroud)
我明白了:
ERROR: a column definition list is required for functions returning "record"
Run Code Online (Sandbox Code Playgroud)
我知道column1是整数类型:
SELECT * FROM test('column1') f(a int);
Run Code Online (Sandbox Code Playgroud)
结果是正确的,因为我知道这将是Integer类型.
当我尝试:
SELECT * FROM test('column1') f(a varchar);
Run Code Online (Sandbox Code Playgroud)
我收到错误:
ERROR: wrong record type supplied in RETURN NEXT
DETAIL: Returned type integer does not match expected type character varying in column 1.
Run Code Online (Sandbox Code Playgroud)
现在我的问题是:如何摆脱我定义类型'f(a int)'的部分空间.它应该是可行的,因为Postgres知道什么是返回类型.我尝试了IMMUTABLE选项,但没有成功.
您可以将值转换为函数内的文本,并声明该函数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';
Run Code Online (Sandbox Code Playgroud)
现在SELECT test('column1');产量:
test
------
1
2
(2 rows)
Run Code Online (Sandbox Code Playgroud)
...和(使用我的区域设置)SELECT test('column2');产生:
test
------------
2012-12-22
2013-01-01
(2 rows)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5974 次 |
| 最近记录: |