oracle内部提供的在数据库内部和应用程序间通信的方式有以下几种:
1.警报,就是DBMS_ALERT包提供的功能;
2.管道,由DBMS_PIPE提供;
3.高级队列,这个就很复杂,当然提供的功能也是很高级的。
当然还可以使用外部过程,比如用PL/SQL封装外部的基于C的DLL或JAVA也能实现数据库和应用程序间的通信。 要使用这些功能,必须知道各个功能的特点,根据需要选用。 警报和事务相关的,是异步发送的;管道是与事务无关的,是同步发送的。

dbms_alert用于生成并传递数据库预警信息。使用包DBMS_ALERT,则必须以SYS登陆,为该用户授予执行权限。
sql>conn sys/oracle as sysdba
sql>grant execute on dbms_alert to scott;

1.register:用于注册预警事件
示例如下:
sql>exec dbms_alter.register('alter1');
2.remove:用于删除会话不需要的预警事件.
3.removeall:用于删除当前会话所有已注册的预警事件
语法如下:dbms_alter.removeall;
4.set_defaults
用于设置检测预警事件的时间间隔,默认时间间隔为5秒
5.signal:用于指定预警事件所对应的预警消息.
6.waitany:用于等待当前会话的任何预警事件,并且在预警事件发生时输出相应信息.在执行该过程之前,会隐含地发出COMMIT.
语法如下:
dbms_alter.waitany (
    name out varchar2,
    message out varchar2,
    status out integer,
    timeout in number default maxwait
);
注:status用于返回状态值,返回0表示发生了预警事件,返回1表示超时;timeout用于设置预警事件的超时时间.
7.waitone:
用于等待当前会话的特定预警事件,并且在发生预警事件时输出预警消息.
语法同上

警报的使用:
简单来说,警报是在服务器端发出,然后在客户端接收,这就需要在客户端有一个线程来监听警报。现在拿SQLPLUS做个例子,打开两个SQLPLUS,分别用提示符SQL1和SQL2表示。
1、首先应先授予用户使用DBMS_ALERT的权限。登录到SYS用户下,执行一下语句:

conn sys/oracle as sysdba
grant execute on dbms_alert to scott;
 

2、发送进程(服务器端发出)

SQL1>DECLARE
  V_ALERTNAME VARCHAR2(30) := 'alert1';
BEGIN
  DBMS_ALERT.SIGNAL(V_ALERTNAME, 'hello, this   is   sending   process!');
  COMMIT; --必须COMMIT,警报才会真正被发出
END;
/
 

3、接受进程(客户端接收)

SQL2>set serveroutput ON;
SQL2>DECLARE
  V_ALERTNAME VARCHAR2(30) := 'alert1';
  V_STATUS    NUMBER;
  V_MSG       VARCHAR2(100);
BEGIN
  DBMS_ALERT.REGISTER(V_ALERTNAME);  --注册要接收信息的警报器
  DBMS_ALERT.WAITONE(V_ALERTNAME, V_MSG, V_STATUS);
  IF V_STATUS != 0 THEN
    DBMS_OUTPUT.PUT_LINE('error');
  ELSE
    DBMS_OUTPUT.PUT_LINE(V_MSG);
  END IF;
END;
/
 

注意:接收者要接收警报必须执行等待过程,等待警报的到来,否则不会得到任何警报的。
用二种方法测试一下:
方法一:先执行步骤2,再执行步骤3。这时可以获得警报
方法二:先执行步骤3,再执行步骤2。这时不能获得任何警报,执行步骤3的SESSION处于等待状态,当下一时间点再次执行步骤2时,就可以获得警报。
警报可以是一对一,也可以是一对多的,即一个警报可以同时被多个接收者接收。

oracle系统包——dbms_alert用法的更多相关文章

  1. oracle系统包——dbms_random用法及order by 小结(转)

    dbms_random是一个可以生成随机数值或者字符串的程序包. 这个包有initialize().seed().terminate().value().normal().random().strin ...

  2. oracle系统包——dbms_job用法(oracle定时任务)

    用于安排和管理作业队列,通过使用作业,可以使ORACLE数据库定期执行特定的任务. 一.dbms_job涉及到的知识点1.创建job:variable jobno number;dbms_job.su ...

  3. oracle系统包——DBMS_PIPE用法

    DBMS_PIPE包用于在同一例程(实例)的不同会话之间进行通信:注意,如果用户要执行包dbms_pipe中的过程和函数,则必须要为用户授权. sql>conn sys/oracle as sy ...

  4. oracle系统包——dbms_random用法

    oracle中随机数的包的源文件目录:{oracle_home}\rdbms\admin\dbmsrand.sql 1.返回0~1间的随机数(包括0和1)sql> select dbms_ran ...

  5. oracle系统包—-dbms_output用法

    dbms_output包主要用于调试pl/sql程序,或者在sql*plus命令中显示信息(displaying message)和报表,譬如我们可以写一个简单的匿名pl/sql程序块,而该块出于某种 ...

  6. oracle系统包——dbms_transaction用法

    用于在过程,函数和包中执行sql事务处理语句. 1.read_only用于开始只读事务,其作用与sql语句set transaction read only完全相同2.read_write用于开始读写 ...

  7. oracle系统包——dbms job用法(oracle定时任务)

    用于安排和管理作业队列,通过使用作业,可以使ORACLE数据库定期执行特定的任务. 一.dbms_job涉及到的知识点1.创建job:variable jobno number;dbms_job.su ...

  8. .Net程序员学用Oracle系列(29):PLSQL 之批量应用和系统包

    1.批量数据操作 1.1.批量生成数据 1.2.批量插入数据 2.批量生成脚本 3.生成数据字典 4.常见系统包 4.1.DBMS_OUTPUT 4.2.DBMS_RANDOM 4.3.其它系统包及常 ...

  9. ORACLE中DBMS_SQL的用法

    ORACLE中DBMS_SQL的用法   对于一般的select操作,如果使用动态的sql语句则需要进行以下几个步骤: open   cursor---> parse---> define ...

随机推荐

  1. Java NIO学习-详细内容(二)

    五.Selector与SelectionKey Selector是SelectableChannel 对象的多路复用器,为什么使用Selector? 仅用单个线程来处理多个Channels的好处是,只 ...

  2. C++裁剪文件,截断文件,_chsize()

    errno_t _chsize_s( int fd, __int64 size ); 详见msdn知识库 _chsize将文件裁剪为指定大小,大小的度量方法与 long ftell(FILE * fp ...

  3. 通用性站点管理后台(Bee OPOA Platform) (5)- 【扩展】基于WebSocket的监视Sql执行功能

    开始 底层的东西总是很类似, 看了园里的Fish-Li的一系列文章, 写得真好, 无论是风格还是内容. 本来也想想方便点就用remoting实现监视功能算了, 但这样就需要一个Winform的项目了. ...

  4. BOLT.NET 学习笔记(一) 开篇 用.net winform 快速开发 炫酷的界面

    BOLT.NET 学习笔记(一) 开篇 用.net winform 快速开发 炫酷的界面 bolt 基本介绍 Bolt界面引擎是迅雷公司从2009年开始开发的第四代界面库.迅雷7是首个采用该引擎成功开 ...

  5. HBase介绍(3)---框架结构及流程

    HBASE依托于Hadoop的HDFS作为存储基础,因此结构也很类似于Hadoop的Master-Slave模式,Hbase Master Server 负责管理所有的HRegion Server,但 ...

  6. css 三彩loading

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title&g ...

  7. /Date(1512551901709+0800)/转换

    var convertDT=function(dt) { dt.replace(/Date\([\d+]+\)/, function (a) { eval('d = new ' + a) }); al ...

  8. MongoDB复制集与Raft协议异同点分析

    此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 一.日志复制流程: a.raft leader节点在接收client请求后,先将请求写到日志中,再将日志通过 ...

  9. js计算机样式window.getComputedStyle(ele,null)与

    一.getComputedStyle兼容IE8以上,范户籍的计算样式的值都是绝对值,没有相对单位(如:width:10em; 它打印出来是160px) window.getComputedStyle( ...

  10. POJ - 2421 Constructing Roads (最小生成树)

    There are N villages, which are numbered from 1 to N, and you should build some roads such that ever ...