zoukankan      html  css  js  c++  java
  • [PLSQL]DMBS_ALERT at a glance

    貌似DBMS_ALERT也可以用来作为session间信息的传递,所以干脆一不做二不休,多来一篇水文把DBMS_ALERT也搞了。

    DBMS_ALERT相关接口

    DBMS_ALERT提供如下一些procedures,

    -  REGISTER  procedure   (当前session注册到某个alert, 然后从这个alert接收信息) 
    -  REMOVE procedure  (不再接收某个alert发送的通知信息)
    -  REMOVEALL procedure (不再接收当前session注册的所有alert发送的信息)
    -  SIGNAL procedure (发送信息到注册改alert的session)
    -  WAITONE procedure (等待从注册的alert发送的信息)
    -  WAITANY procedure (等待从当前session注册的所有的alert发送的信息)
    -  SET_DEFAULTS procedure (sets the polling interval)
    关于DBMS_ALERT有一个需要特别注意的地方:
    ALERT的基于事务的(transaction-based), 也就是说当你在一个session调用dbms_alert.signal的时候,如果调用之后没有commit的话,注册到这个alert等待的session还是hanging的状态,不会接收到alert发送过来的信息。
    如果application不需要这种基于事务的(transactional-based)alert, 可以用dbms_pipe来实现。 
    关于alert的信息,可以从一个视图sys.DBMS_ALERT_INFO查到。

    DBMS_ALERT的一个简单示例

    Session1 注册(监听)并等待一个叫 test_alert的alert,等待时间设置30秒,如下,

    set serveroutput on
    declare
    message
    varchar2(200);
    status
    integer;
    begin
    dbms_alert.register(
    'test_alert');
    dbms_alert.waitone(
    'test_alert', message, status, 30);
    dbms_output.put_line(
    'status=' || status);
    dbms_output.put_line(
    'message=' || message);
    dbms_alert.remove(
    'test_alert');
    end;
    /

    Session2 先来查看dbms_alert_info的内容,

    SQL> select * from sys.dbms_alert_info;

    NAME SID C MESSAGE
    ------------------------------ ------------------------------ - --------------------
    TEST_ALERT 006B31330001 N

    等30秒看看seesion1的情况,

    status=1
    message
    =

    PL
    /SQL procedure successfully completed.

    显示status为1,表示timeout, message没有内容说明没有接收到信息。

    现在在session2中发送信息,注意要commit, 否则session1还是接收不到的!

    SQL> exec dbms_alert.signal('test_alert', 'hello frank');

    PL
    /SQL procedure successfully completed.

    SQL
    > commit;

    Commit complete.

    现在来看session1的情况,

    status=0
    message
    =hello frank

    PL
    /SQL procedure successfully completed.

    status 为0, message显示的就是session2中发送的信息。




    --------------------------------------
    Regards,
    FangwenYu
  • 相关阅读:
    JavaScript 事件
    Docker 部署asp.netcore
    Docker 安装
    JavaScript 窗口操作
    JavaScript 定时器
    JavaScript Dom
    Javascript try catch es5标准模式
    JavaScript 数组去重
    JavaScript 返回具体类型方法
    mysql 触发器
  • 原文地址:https://www.cnblogs.com/fangwenyu/p/1872135.html
Copyright © 2011-2022 走看看