我很想在我的PL / pgSQL函数中利用PostgreSQL 的SQL输出格式,但我开始觉得我必须放弃这个想法。
我有我的PL / pgSQL函数query_result
:
CREATE OR REPLACE FUNCTION query_result(
this_query text
) RETURNS SETOF record AS
$$
BEGIN
RETURN QUERY EXECUTE this_query;
END;
$$ LANGUAGE plpgsql;
..从输入文本查询中快速返回SETOF
条记录,我可以将其用于动态查询的SQL脚本:
mydb=# SELECT * FROM query_result('SELECT ' || :MYVAR || ' FROM Alice') AS t (id int);
id
----
1
2
3
所以我希望找到一种方法来提供来自 PL / pgSQL 函数的相同格式良好的输出,但是RAISE
不支持SETOF
类型,从SETOF
记录到文本没有神奇的预定义强制转换(我知道我可以创建自己的CAST
..)
如果我创建了一个虚拟print_result
函数:
CREATE OR REPLACE FUNCTION print_result(
this_query text
) RETURNS void AS
$$
BEGIN
SELECT query_result(this_query);
END;
$$ LANGUAGE plpgsql;
..我无法打印格式化的输出:
mydb=# SELECT print_result('SELECT ' || :MYVAR || ' FROM Alice');
ERROR: set-valued function called in context that cannot accept a set
...
感谢您的任何建议(最好与PostgreSQL 8.4配合使用)。
答案 0 :(得分:1)
好的,要对print_result
中的结果集做任何事情,你必须循环它。那看起来像这样 -
此处result_record
被定义为record
变量。为了便于解释,我们还假设您有一个formatted_results
变量,该变量定义为text
并默认为空字符串以保存格式化结果。
FOR result_record IN SELECT * FROM query_result(this_query) AS t (id int) LOOP
-- With all this, you can do something like this
formatted_results := formatted_results ||','|| result_record.id;
END LOOP;
RETURN formatted_results;
因此,如果您更改print_results
以返回文本,请按照我的描述声明变量并将其添加到其中,您的函数将返回以逗号分隔的所有结果列表(在此处添加逗号)结束,我相信你可以利用PostgreSQL的string functions来修剪它。我不确定这正是你想要的,但是这应该可以让你对如何操作结果集有所了解。您可以获得有关控制结构的更多信息here,这些信息可以让您随心所欲地执行任何操作。
编辑回答真实问题:
将数据元组格式化为可读文本的能力是psql客户端的功能,而不是PostgreSQL服务器。要在服务器中使用此功能,需要从psql实用程序中提取相关代码或模块,并将它们重新编译为数据库函数。这似乎是可能的(也有可能有人已经这样做了),但我对这个过程不够熟悉,无法提供如何做到这一点的良好描述。最有可能的是,将查询结果格式化为文本的最佳解决方案是利用PostgreSQL的字符串格式化函数来实现应用程序所需的功能。