0

环境:Oracle 12c

我是 Oracle 高级队列 (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 列的方法,以便在发生这种情况时执行一些其他操作。

4

2 回答 2

0

仅供参考,我已从评论和其他站点中获取链接/信息,以使用 Oracle 高级队列作为我的解决方案的基础。

为此目的向我提供的另一个链接是:

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

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

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

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

当涉及到异步处理而不是轮询具有预定作业的表时,这是迄今为止最好的选择。

于 2020-05-06T04:56:19.457 回答
0

不是很清楚的问题。“MY_TABLE”是 AQ Queue 的表吗?如果是这样,那么请查看 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

于 2021-09-28T07:36:48.003 回答