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. JVM 方法调用之静态分派

    分派(Dispatch)可能是静态也可能是动态的,根据分派依据的宗量数可分为单分派和多分派.这两种分派方式的两两组合就构成了静态单分派,静态多分派,动态单分派,动态多分派这4种组合.本章讲静态分派. ...

  2. leetcode 反转字符串

    请编写一个函数,其功能是将输入的字符串反转过来. 示例: 输入:s = "hello" 返回:"olleh" /** * @param {string} s * ...

  3. 关于dm-file-uploader(dmUploader)上传时传参

    官网:https://github.com/danielm/uploaderDemo Online https://danielmg.org/demo/java-script/uploader/bas ...

  4. ASP.NET Web API总结

    1. 跨域 提供Http层的web api时,通常需要考虑跨域问题. 因为浏览器处于安全考虑,默认不允许前端页面向不是自己所在的ip/域名发起请求,因此需要服务器端指明自己允许部分或所有域名进行跨域请 ...

  5. 【《Effective C#》提炼总结】提高Unity中C#代码质量的22条准则

    引言 原则1尽可能地使用属性而不是可直接访问的数据成员 原则2偏向于使用运行时常量而不是编译时常量 原则3 推荐使用is 或as操作符而不是强制类型转换 原则4 推荐使用条件属性而不是if条件编译 原 ...

  6. TVS

    TVS 电子电路中二极管是非常常见的元器件,按照材料主要分为锗二极管.硅二极管.按用途的不同又可分为瞬态二极管.整流二极管.检波二极管.稳压二极管.变容二极管.光电二极管.发光二极管.开关二极管.快速 ...

  7. 【OCP|052】052考试题库又变了,最新052题库收集整理-第15题

    15.Which two are true about space management in tablespaces? A) Locally managed tablespaces have eit ...

  8. How to Mount a Remote Folder using SSH on Ubuntu

    Connecting to a server across the internet is much more secure using SSH. There is a way that you ca ...

  9. RDLC报表的相关技巧四(报表内依照分组重置页码)

    报表中不同的组重置页数,如采购订单每一个PO显示的页数都是针对这个PO的,而不是总的页数. 步骤: 1.在各组实例中启用分页符2.用高级模式将组的属性中的ResetPageNumber设置为True3 ...

  10. C++小总结

    1.C与C++的简单区别 1.建立的文件类型不一样,C语言是.c,C++是.cpp 2.引入的头文件不一样 3.C++有命名空间 4.输入输出语句不一样 5.C语言不允许重载,C++可以重载 6.自定 ...