首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从PL/pgSQL函数中打印ASCII-art格式的SETOF记录

从PL/pgSQL函数中打印ASCII-art格式的SETOF记录
EN

Stack Overflow用户
提问于 2013-06-21 14:22:07
回答 1查看 683关注 0票数 0

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

我有我的PL/pgSQL函数query_result

代码语言:javascript
复制
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脚本:

代码语言:javascript
复制
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函数:

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION print_result(
    this_query text
) RETURNS void AS 
$$
    BEGIN
      SELECT query_result(this_query);                                                                                                                                   
    END;
$$ LANGUAGE plpgsql;

..I无法打印格式化输出:

代码语言:javascript
复制
mydb=# SELECT print_result('SELECT ' || :MYVAR || ' FROM Alice');
ERROR:  set-valued function called in context that cannot accept a set
...

谢谢您的建议(最好与PostgreSQL 8.4一起工作)。

EN

回答 1

Stack Overflow用户

发布于 2013-06-21 15:19:53

好的,要在print_result中对结果集做任何事情,就必须对其进行循环。看起来会像这样-

这里,result_record被定义为一个record变量。为了便于解释,我们还假设您有一个formatted_results变量,该变量被定义为text,默认为空字符串以保存格式化的结果。

代码语言:javascript
复制
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的字符串格式函数来实现应用程序所需的功能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17237636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档