[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中发送的信息。
--------------------------------------
Regards,
FangwenYu