使用 Oracle Advanced Queues 监视数据库 table 列何时更新

Using Oracle Advanced Queues to monitor when a database table column is updated

环境:Oracle 12c

我是 Oracle Advanced Queues (AQ) 的新手,它看起来应该是替代轮询的最佳方法。

基于此,我想利用AQ基于以下触发器使用:

CREATE OR REPLACE TRIGGER MY_TRG  
AFTER UPDATE OF STATUS ON "MY_TABLE"  
REFERENCING NEW AS NEW OLD AS OLD  
FOR EACH ROW  
declare  
   v_status    INTEGER;  
begin      
    if :OLD.status = 'ERROR' and (:NEW.status = 'OK' or :NEW.status = 'ERROR') then  
      --
      -- do some Advanced Queue processing here ?
      --   
    end if;
end;  

因此,不是在更新 STATUS 列时进行轮询,而是可以使用 AQ 来实现某种类型的 CALLBACK 功能吗?

我基本上需要一种方法来了解 STATUS 列何时更新,以便在发生这种情况时执行一些其他操作。

仅供参考,我已采用评论和其他站点提供的 links/information 使用 Oracle Advanced Queues 作为我的解决方案的基础。

为此目的提供给我的另一个 link 是:

https://markhoxey.wordpress.com/2016/03/01/asynchronous-processing-using-aq-callback/

为了更好地回答这个问题,我使用了 Mark Hoxey 在他的文章中提供的示例代码,特别是在状态更新期间通过我的 table 触发器调用的 PL/SQL CALLBACK 例程。

您可以在此处查看所有可用代码:

https://onedrive.live.com/?id=B48A94826582EA7D%2158434&cid=B48A94826582EA7D

这是迄今为止异步处理而不是轮询 table 计划作业的最佳选择。

不是很清楚的问题。 “MY_TABLE”是 AQ 队列的 table 吗?如果是这样,那么看看 AQ“原生”回调(正如您所问的那样)。

示例不详尽,请参阅文档了解完整变体。

declare
   p$queue varchar2(30) := 'YOU_QUEUE';
   p$call_back_procedure_name varchar2(30) := 'you_cb_proc';
   p$consumer varchar2(30) := 'YOU_CONS'; 
   m$reg   SYS.AQ$_REG_INFO_LIST;
begin
    m$reg := SYS.AQ$_REG_INFO_LIST();

    m$reg.extend();
    m$reg(1) := SYS.AQ$_REG_INFO(
        name => p$queue || ':' || p$consumer,
        namespace => DBMS_AQ.NAMESPACE_AQ,
        callback => 'plsql://' || p$call_back_procedure_name || '?PR=1',
        context => null,
        qosflags => DBMS_AQ.NTFN_QOS_RELIABLE,
        timeout => 0
    );

    dbms_aq.register(m$reg, 1);
end;
/

更多文档:https://docs.oracle.com/database/121/ARPLS/d_aq.htm#ARPLS100