DBMS_ALERT包用于发布报警信息。它是单向的,以事务提交为基础的,对数据库报警事件的异步报警通知。
报警是基于事务的,也就是说除非发出报警信号的事务被提交commit,才会触发报警,否则等待过程中的事务,即报警接收方,不会获得报警。
首先要授权用户拥有执行DBMS_ALERT包的权限。
--向用户username授予在 dbms_alert包上的执行权限
1 grant execute on dbms_alert to username;
报警需要定义报警的发布方和接收方。
报警发布方:
发布报警事件(信号):signal
语法:
1 DBMS_ALERT.signal(name in varchar2, 2 message in varchar2);
该过程用于发布报警信号,只有在提交事务时(commit),才会触发报警,发出报警信息,当退回事务时(rollback),是不会触发报警的。
其中 name用于指定报警名称,message用于指定报警携带的消息。
报警接收方:
(1)注册报警事件(信号):register
DBMS_ALERT.register(name in varchar2); --name为报警名称
执行该过程后,将该报警名添加到该会话对应的报警注册表中。
(2)等待特定报警或者等待任意报警
--等待指定报警事件
DBMS_ALERT.waitone(name in varcahr2, --指定等待的报警名称 message out varchar2, --返回报警发布方发布的报警消息 status out integer, --在timeout时间段内发生报警则返回0,如果超时则返回1 timeout in number default MAXWAIT); --等待报警发生的时间段,如果在此时间段内无报警发生,则status返回1
--等待任意报警事件
1 DBMS_ALERT.waitany(name out varcahr2, --返回发生的报警事件名称 2 message out varchar2, 3 status out integer, 4 timeout in number default MAXWAIT);
(3)删除注册的特定报警或者所有报警:remove
DBMS_ALERT.remove(name in varchar2);
DBMS_ALERT.removeall;
(4)设置检测报警事件的时间间隔,默认时间间隔为5秒,即轮询时间。
DBMS_ALERT.set_defaults(sensitivity in number); --以秒为单位
1 -- 报警接收方 2 declare 3 -- Local variables here 4 v_alert_name varchar2(30) := 'alert_name_1'; 5 v_status integer; 6 v_msg varchar2(200); 7 begin 8 -- Test statements here 9 --注册报警信号 10 DBMS_ALERT.register(v_alert_name); 11 --监听报警,等待报警发生 12 DBMS_ALERT.waitone(v_alert_name, v_msg, v_status); 13 --如果status不返回0,则表示未接收到报警信号 14 if v_status != 0 then 15 DBMS_OUTPUT.put_line('error'); 16 end if; 17 DBMS_OUTPUT.put_line(v_msg);--输出报警消息 18 end;
1 -- 报警发布方 2 declare 3 -- Local variables here 4 v_alert_name varchar2(20) := 'alter_name_1'; 5 6 begin 7 -- 发布报警信号 8 DBMS_ALERT.signal(v_alert_name, '发布报警消息'); 9 commit; --当commit时,才会触发报警,如果是rollback,则不触发报警 10 end;