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

Postgresql 从PL/pgSQL函数内部打印ASCII艺术格式的记录集,postgresql,plpgsql,Postgresql,Plpgsql,我很想在PL/pgSQL函数中利用PostgreSQL的SQL输出格式,但我开始觉得我必须放弃这个想法 我有我的PL/pgSQL函数query\u result: 创建或替换函数查询结果( 这是一个查询文本 )将记录集返回为 $$ 开始 返回查询执行此_查询; 结束; $$语言plpgsql; …从输入文本查询愉快地返回一组记录,我可以将其用于动态查询的SQL脚本: mydb=# SELECT * FROM query_result('SELECT ' || :MYVAR || ' FROM

我很想在PL/pgSQL函数中利用PostgreSQL的SQL输出格式,但我开始觉得我必须放弃这个想法

我有我的PL/pgSQL函数
query\u result

创建或替换函数查询结果(
这是一个查询文本
)将记录集返回为
$$
开始
返回查询执行此_查询;
结束;
$$语言plpgsql;
…从输入文本查询愉快地返回一组记录,我可以将其用于动态查询的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\u 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配合使用)。

好的,要对
print\u result
中的结果集执行任何操作,您必须对其进行循环。看起来是这样的-

这里,
result\u record
被定义为
record
变量。为了便于解释,我们还假设您有一个
格式化的_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的字符串格式化函数来实现应用程序所需的功能。

您可以发布PL/PGSQL函数吗?使用该语言运行任意查询并返回一组结果应该是完全可行的,但我不清楚您遇到了哪些障碍。@Scott,谢谢,我用更多细节更新了问题。谢谢@Scott:我知道我可以手动格式化文本输出,但是我想知道是否有一种方法可以利用标准的ASCII art格式化SQL函数来美化终端调用的结果。postgres服务器不进行这种格式化,它只返回数据。您正在使用的“psql”客户机对其获取的数据进行格式化。您必须获取psql实用程序的源代码并在其中找到实现该功能的代码,然后将其编译为postgres服务器的函数。我相信这是可行的,但我不能告诉你确切的步骤。用postgres的字符串函数实现某些东西可能更容易满足您的需要。我明白了。。谢谢你,斯科特。PS你可能会在某个时候用这个细节更新你的答案!我相信我会把函数分解成更小的PL/pgSQL函数,返回
SETOF
records,这样我就不必处理自制的美化了。