一、相关方法
1. DBMS_ALERT.REGISTER 为当前会话注册一个预警事件,本操作会提交当前事务。
语法:DBMS_ALERT.REGISTER ( NAME IN VARCHAR(30) ) ;
说明:NAME 输入参数,预警事件名。
2. DBMS_ALERT.REMOVE 删除当前会话的一个预警事件,如果该预警事件正在 DBMS_ALERT.WAITONE 或者 DBMS_ALERT.WAITANY 等待,则被阻塞,直到 DBMS_ALERT.WAITONE 或者 DBMS_ALERT.WAITANY结束。本操作会提交当前事务。
语法:DBMS_ALERT. REMOVE ( NAME IN VARCHAR(30) )
3. DBMS_ALERT.REMOVEALL 删除当前会话下所有的预警事件,如果该预警事件正在 DBMS_ALERT.WAITONE 或者 DBMS_ALERT.WAITANY 等待,则被阻塞,直到 DBMS_ALERT.WAITONE 或者 DBMS_ALERT.WAITANY结束。本操作会提交当前事务。
语法:DBMS_ALERT. REMOVEALL () ;
4. DBMS_ALERT.SIGNAL 给所有名为name的预警事件发送消息,当前事务提交时生效。
语法:DBMS_ALERT. SIGNAL ( NAME IN VARCHAR(30), MESSAGE IN VARCHAR(1800) );
说明:MESSAGE 输入参数,待发送的消息。
5. DBMS_ALERT.SET_DEFAULTS 设置轮询时间,在DM中无用,只为兼容oracle。
语法:DBMS_ALERT. SET_DEFAULTS ( SENSITIVITY IN INT ) ;
说明:SENSITIVITY 输入参数,轮询时间间隔,单位秒。参数为NULL,则使用默认值5s。
6. DBMS_ALERT.WAITONE 预警事件上等待预警信号,获得DBMS_ALERT. SIGNAL发送的消息内容。本操作会提 交当前事务。
语法:
DBMS_ALERT. WAITONE (
NAME IN VARCHAR(30),
MESSAGE OUT VARCHAR(1800),
STATUS OUT INT,
TIMEOUT IN INT DEFAULT 86400000 );
说明:
MESSAGE 输出参数,获得DBMS_ALERT. SIGNAL发送的消息。
STATUS 输出参数,表示WAITONE是否成功。如果BMS_ALERT. WAITONE传入的NAME是已经注册过的预警,则0表示预警发生;1 表示预警等待超时。
TIMEOUT 输入参数,WAITONE的等待超时时间,单位为秒,默认值为86400000秒。如果TIMEOUT设置为空串、null和负值时,DM处理成默认值。
7.DBMS_ALERT. WAITANY 同DBMS_ALERT. WAITONE。
语法:
DBMS_ALERT. WAITANY (
NAME OUT VARCHAR(30),
MESSAGE OUT VARCHAR(1800),
STATUS OUT INT,
TIMEOUT IN INT DEFAULT 86400000 ) ;
二、例子:为当前会话注册一个名为 A1 的预警事件,给预警事件上等待预警信号,获得 DBMS_ALERT. SIGNAL发送的消息内容,最后删除当前会话的一个预警事件。同时,会话 1存活期间,可以通过DBMS_ALERT_INFO视图查看到A1预警事件。
会话1: CREATE OR REPLACE PROCEDURE WAIT1 IS
msg VARCHAR(1800);
statu INTEGER;
BEGIN
dbms_alert.register('A1');
dbms_alert.waitone('A1', msg, statu, 39);
print 'Msg: ' || msg || ' Statu: ' || statu;
dbms_alert.remove('A1');
END WAIT1;
EXEC WAIT1;
同时会话2执行:
CREATE OR REPLACE PROCEDURE SET_ALERT1 is
BEGIN
dbms_alert.signal('A1', 'this is a sig');
COMMIT;
END SET_ALERT1;
/
EXEC SET_ALERT1;
select * from DBMS_ALERT_INFO;