提高通知以打印表格数据

问题描述 投票:3回答:3

我希望能够从sql脚本/函数打印一些调试信息。当然,我可以做到这一点

RAISE NOTICE 'hello!'

但我还需要打印整个表格的数据。这不起作用:

RAISE NOTICE '%' (SELECT * FROM table1)

有可能吗?怎么样?

sql postgresql postgresql-9.2
3个回答
8
投票

最直接的方法是迭代for loop中的行,并使用RAISE NOTICE包含您感兴趣插入其中的每个列。

即:

    FOR items IN SELECT * FROM table1 LOOP
        RAISE NOTICE 'col1: %s, col2: %s', quote_ident(items.col1), quote_ident(items.col2);
    END LOOP;

其中items被声明为RECORD


1
投票

RAISE NOTICE将打印表格数据而不对齐,因此很难阅读。更灵活的方式是使用refcursor

DECLARE
  _temp_cur1 refcursor = 'unique_name_of_temp_cursor_1';
...
BEGIN
...

  OPEN _temp_cur1 FOR
  SELECT *
  FROM table1;
...
END

然后在事务中运行函数:

BEGIN;
SELECT my_func();
FETCH ALL FROM "unique_name_of_temp_cursor_1";    --here is double-quotes ""!
ROLLBACK;     --do not save any changes to DB during tests (or use COMMIT;)

这种refcursor可以在同一笔交易中读取。如果你没有用BEGIN和ROLLBACK(或COMMIT)包装你的测试,PostgreSQL将无法找到这个。


1
投票

从postgres 9.3开始,您可以使用to_json()将记录转换为适合通知的文本,

RAISE NOTICE '%', to_json(record1);
© www.soinside.com 2019 - 2024. All rights reserved.