获取有关PostgreSQL的RAISE NOTICE的所有通知

时间:2014-01-14 09:36:37

标签: php postgresql

我有大数据库功能,有多行这样的

RAISE NOTICE 'some step completed';

我希望在我的PHP应用程序中获得所有这些通知。我发现只有pg_last_notice()函数只返回最后一次通知。

有什么方法可以得到所有通知吗?


实施例: 数据库功能:

CREATE OR REPLACE FUNCTION do_smth()
  RETURNS void AS
$BODY$

BEGIN

-- some actions
RAISE NOTICE 'Result of the actions:...';
-- some other actions
RAISE NOTICE 'Result of the other actions..';

$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

PHP代码:

<?php
// ...
$db->exec("SELECT do_smth()"); // executing DB function

$last_notice = pg_last_notice($db_connection); 
// returns 'NOTICE: Result of the other actions..'

2 个答案:

答案 0 :(得分:7)

根据libpq notice documentation“默认通知处理函数在stderr上打印消息,但应用程序可以通过提供自己的处理函数来覆盖此行为。”

在您的情况下,“应用程序”(php本身)通过指定名为_php_pgsql_notice_handler的自定义通知处理程序来覆盖此行为:

Line #1367: PQsetNoticeProcessor(pgsql, _php_pgsql_notice_handler, (void*)Z_RESVAL_P(return_value));

这意味着PostgreSQL通知不会进一步传播到stderr,而是由该处理程序捕获和处理。

在处理程序本身(第827行)中,您可以看到每次发出通知时,php都会更新包含它的变量,并且不会将值附加到某个数组。因此,最后只有最后一个通知存在于该变量中,可由calling pg_last_notice()获得。

因此,看起来不可能从PHP中获取以前的PostgreSQL通知。

但是,如果您进一步查看相同的通知处理程序,您会看到它正在将通知写入错误日志,以防pgsql.ignore_notices = 0pgsql.log_notices = 1E_NOTICE被包含在内进入error_reporting。我想有一些PHP错误处理函数杂耍你将能够获得一些东西。

答案 1 :(得分:1)

pg_last_notice()现在接受一个可选参数来指定操作。

这可以通过以下新常数之一完成:

  • PGSQL_NOTICE_LAST :返回最新通知
  • PGSQL_NOTICE_ALL :返回所有通知
  • PGSQL_NOTICE_CLEAR :清除通知

有关7.1 HERE版中已更改功能的更多信息。