DBMS_ALERT 包

dbms_alert 系统包用于生成并传递数据库预警信息,当发生特定数据库事件时能够将预警信息传递给应用程序。

达梦还提供了dbms_alert_info视图来实现跟ORACLE类似的功能,查看注册过的预警事件。

DM MPP环境和DM DSC环境下不支持DBMS_ALERT包。

4.1 相关方法

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)

)

参数详解

  • NAME

输入参数,预警事件名。

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)

)

参数详解

  • NAME

输入参数,预警事件名。

  • 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

)

参数详解

  • NAME

输入参数,预警事件名。

  • MESSAGE

输出参数,获得DBMS_ALERT. SIGNAL发送的消息。

  • STATUS

输出参数,表示WAITONE是否成功。如果BMS_ALERT.WAITONE传入的NAME是已经注册过的预警,则0 表示预警发生;1 表示预警等待超时。

  • TIMEOUT

输入参数,WAITONE的等待超时时间,单位为秒,默认值为86400000秒。

7.DBMS_ALERT. WAITANY

语法如下:

DBMS_ALERT. WAITANY (

  NAME OUT VARCHAR(30),

  MESSAGE OUT VARCHAR(1800),

  STATUS OUT INT,

  TIMEOUT IN INT DEFAULT 86400000

)

参数详解

同DBMS_ALERT. WAITONE。

功能说明:

等待当前会话任意一个预警信号,获得DBMS_ALERT.SIGNAL发送的消息内容。本操作会提交当前事务。会话上没有预警事件时,报错没有注册预警事件。

4.2 举例说明

使用包内的过程和函数之前,如果还未创建过例子中的系统包。请先调用系统过程创建系统包。

SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_ALERT');

例1 为当前会话注册一个名为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;

会话1存活期间,在会话2上,通过dbms_alert_info视图查看A1。

select * from dbms_alert_info;

结果为:

NAME SID CHANGED MESSAGE

A1 83034240 Y this is a sig
微信扫码
分享文档
扫一扫
联系客服