按照预期运行以下工作:
LISTEN my_channel; NOTIFY my_channel,'my message text';
然而使用pg_notify()函数返回空值,并且不会发送通知.也没有错误.使用的一个例子是:
SELECT pg_notify('my_channel','my message text');
我可以使用NOTIFY功能,但我的目标是将通知简化为一个查询,如下所示:
select pg_notify(get_player_error_channel(username)::TEXT,'test'::TEXT) from player;
我假设我一定会错过一些可笑的东西,但是我没有想到这个原因.可以在这里找到讨论NOTIFY的页面:http://www.postgresql.org/docs/9.0/static/sql-notify.html
在它上面,它提到了关于pg_notify(),这使我认为没有什么大不相同的.
pg_notify
To send a notification you can also use the function pg_notify(text,text). The function takes the channel name as the first argument and the payload as the second. The function is much easier to use than the NOTIFY command if you need to work with non-constant channel names and payloads.
感谢一如既往的协助
编辑:数据库版本是:
“Postgresql 9.0.3 on i686-pc-linux-gnu,由GCC gcc(GCC)4.2.4编译,32位”
解决方法
他们的答案是“你必须双引号(请听”测试“)
希望服务器不要折叠它们. pg_notify需要一个字符串,而不是一个字符串
relname,它使用不同的规则.“(感谢梅林和汤姆)
这意味着以下工作是因为通道总是被迫小写
LISTEN ERRORCHANNEL; NOTIFY ERRORCHANNEL,'something!'; NOTIFY eRrorChanNel,'something!';
所以,以下,你会收到第一个通知,但不是第二个:
LISTEN "ERRORCHANNEL"; NOTIFY "ERRORCHANNEL",'something!'; NOTIFY "eRrorChanNel",'something!';
类似地,以下将工作,因为双引号强制维护ERRORCHANNEL的情况:
LISTEN "ERRORCHANNEL"; SELECT pg_notify('ERRORCHANNEL','something!');
虽然这不行:
LISTEN ERRORCHANNEL; SELECT pg_notify('ERRORCHANNEL','something!');
在这种情况下,ERRORCHANNEL在LISTEN命令中不是双引号,所以Postgresql强制它小写. channel参数的类型是text,而不是relname,所以在pg_notify()函数中保持不变.通道不一致(ERRORCHANNE!= errorchannel),所以通知不会被接收.