DBMS_ALERT包

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;
原文地址:https://www.cnblogs.com/ly01/p/8612721.html