使用 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
环境: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