[PLSQL]DMBS_ALERT at a glance

 

貌似DBMS_ALERT也可以用来作为session间信息的传递,所以干脆一不做二不休,多来一篇水文把DBMS_ALERT也搞了。

 

DBMS_ALERT相关接口

DBMS_ALERT提供如下一些procedures,

-  REGISTER  procedure   (当前session注册到某个alert, 然后从这个alert接收信息) 
-  REMOVE procedure  (不再接收某个alert发送的通知信息)
-  REMOVEALL procedure (不再接收当前session注册的所有alert发送的信息)
-  SIGNAL procedure (发送信息到注册改alert的session)
-  WAITONE procedure (等待从注册的alert发送的信息)
-  WAITANY procedure (等待从当前session注册的所有的alert发送的信息)
-  SET_DEFAULTS procedure (sets the polling interval)
关于DBMS_ALERT有一个需要特别注意的地方:
ALERT的基于事务的(transaction-based), 也就是说当你在一个session调用dbms_alert.signal的时候,如果调用之后没有commit的话,注册到这个alert等待的session还是hanging的状态,不会接收到alert发送过来的信息。
如果application不需要这种基于事务的(transactional-based)alert, 可以用dbms_pipe来实现。 
关于alert的信息,可以从一个视图sys.DBMS_ALERT_INFO查到。

DBMS_ALERT的一个简单示例

 

Session1 注册(监听)并等待一个叫 test_alert的alert,等待时间设置30秒,如下,

 

 

set serveroutput on
declare
message
varchar2(200);
status
integer;
begin
dbms_alert.register(
'test_alert');
dbms_alert.waitone(
'test_alert', message, status, 30);
dbms_output.put_line(
'status=' || status);
dbms_output.put_line(
'message=' || message);
dbms_alert.remove(
'test_alert');
end;
/

 

 

Session2 先来查看dbms_alert_info的内容,

 

 

SQL> select * from sys.dbms_alert_info;

NAME SID C MESSAGE
------------------------------ ------------------------------ - --------------------
TEST_ALERT 006B31330001 N

 

等30秒看看seesion1的情况,

status=1
message
=

PL
/SQL procedure successfully completed.

 

显示status为1,表示timeout, message没有内容说明没有接收到信息。

 

 

现在在session2中发送信息,注意要commit, 否则session1还是接收不到的!

 

SQL> exec dbms_alert.signal('test_alert', 'hello frank');

PL
/SQL procedure successfully completed.

SQL
> commit;

Commit complete.

 

现在来看session1的情况,

 

 

 

status=0
message
=hello frank

PL
/SQL procedure successfully completed.

 

 

status 为0, message显示的就是session2中发送的信息。

 

 

 

posted @ 2010-11-08 21:29  FangwenYu  阅读(533)  评论(0编辑  收藏  举报