提高通知以打印表格的数据

时间:2014-05-19 04:32:26

标签: sql postgresql postgresql-9.2

我希望能够从sql脚本/函数中打印一些调试信息。当然,我可以通过

来做到这一点
RAISE NOTICE 'hello!'

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

RAISE NOTICE '%' (SELECT * FROM table1)

是否可能以及如何?

3 个答案:

答案 0 :(得分:6)

最直接的方法是迭代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;

将项目声明为RECORD

答案 1 :(得分: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将无法找到这个。

答案 2 :(得分:1)

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

RAISE NOTICE '%', to_json(record1);