从PL / pgSQL函数内部打印ASCII艺术格式的SETOF记录

时间:2013-06-21 14:22:08

标签: postgresql plpgsql

我很想在我的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配合使用)。

1 个答案:

答案 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的字符串格式化函数来实现应用程序所需的功能。