我很想利用PL/pgSQL函数中的PostgreSQL输出格式,但我开始觉得我必须放弃这个想法。
我有我的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;..merrily从输入文本查询返回一个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;..I无法打印格式化输出:
mydb=# SELECT print_result('SELECT ' || :MYVAR || ' FROM Alice');
ERROR: set-valued function called in context that cannot accept a set
...谢谢您的建议(最好与PostgreSQL 8.4一起工作)。
发布于 2013-06-21 15:19:53
好的,要在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的字符串函数来修剪它)。我不确定这正是您想要的,但是这应该给您一个关于如何操作结果集的好主意。您可以获得更多关于控制结构的这里信息,这应该可以让您做任何您想做的事情。
编辑以回答真正的问题:
将数据元组格式化为可读文本的功能是psql客户端的特性,而不是PostgreSQL服务器。要使此特性在服务器中可用,需要从psql实用程序中提取相关代码或模块,并将它们重新编译为数据库函数。这似乎是可能的(也有可能已经有人这样做了),但我还不太熟悉这个过程,无法很好地描述如何做到这一点。最有可能的是,将查询结果格式化为文本的最佳解决方案是使用PostgreSQL的字符串格式函数来实现应用程序所需的功能。
https://stackoverflow.com/questions/17237636
复制相似问题