我希望能够从sql脚本/函数中打印一些调试信息。当然,我可以通过
来做到这一点RAISE NOTICE 'hello!'
但我还需要打印整个表格的数据。这不起作用:
RAISE NOTICE '%' (SELECT * FROM table1)
是否可能以及如何?
答案 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);