• oracle系统包——dbms_alert用法


    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时,就可以获得警报。
    警报可以是一对一,也可以是一对多的,即一个警报可以同时被多个接收者接收。

  • 相关阅读:
    洛谷P1071 潜伏者
    2019BJFU 网站设计(孙俏-web前端开发)实验代码-181002222
    反思——P1307 数字反转
    洛谷P1067 多项式输出
    湖南大学第十五届程序设计竞赛(重现赛)
    2019河北省大学生程序设计竞赛(重现赛)
    2019BJFU C++实验习题(完结)
    配置android source 在ubuntu中编译环境
    Android屏幕保持唤醒状态
    Android richtext
  • 原文地址:https://www.cnblogs.com/linjiqin/p/3152626.html
Copyright © 2020-2023  润新知