我希望能够从sql脚本/函数打印一些调试信息。当然,我可以做到这一点
RAISE NOTICE 'hello!'
但我还需要打印整个表格的数据。这不起作用:
RAISE NOTICE '%' (SELECT * FROM table1)
有可能吗?怎么样?
最直接的方法是迭代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
。
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将无法找到这个。
从postgres 9.3开始,您可以使用to_json()
将记录转换为适合通知的文本,
RAISE NOTICE '%', to_json(record1);