Oracle:模拟“提交后”触发器

时间:2010-09-22 00:49:07

标签: oracle

如何在将某些行插入表格后获得等效的“on commit”触发器?

在向表中插入多行后,我想向外部进程发送一条消息,表明有行准备处理。使用语句级触发器会导致每个插入一条消息,我只想发送一条消息,说“有待处理的行。”

4 个答案:

答案 0 :(得分:7)

创建一份工作。在提交发生之前,它实际上不会被提交。 (注意:DBMS_SCHEDULER通常比DBMS_JOB好,但在这种情况下,您需要使用旧的DBMS_JOB包。)

declare
  jobnumber number;
begin
  dbms_job.submit(job => jobnumber, what => 'insert into test values(''there are rows to process'');');
  --do some work here...
  commit;
end;
/

答案 1 :(得分:3)

当您需要触发外部过程时,请查看DBMS_ALERT而不是DBMS_JOB。

外部进程将通过调用存储过程主动侦听警报。在发出警报并提交警报后,存储过程将立即返回。

请注意,DBMS_ALERT是一个序列化设备。因此,发出相同警报名称的多个会话将阻塞,就像它们更新表中的同一行一样。

答案 2 :(得分:1)

您可以设置一个标记,说“我已发送消息”。 为了确保你在提交时'重置'标志,请使用dbms_transaction.local_transaction_id然后你可以简单地做一个

IF v_flag IS NULL OR dbms_transaction.local_transaction_id != v_flag THEN
  v_flag := dbms_transaction.local_transaction_id;
  generate message
END IF;

答案 3 :(得分:1)

使用Oracle Advanced Queuing,您可以在队列表中使用侦听器排队记录数组。

记录将加载,然后监听器可以启动您希望的任何进程,甚至是Web服务调用

http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28419/d_aq.htm#i1001754