如何在将某些行插入表格后获得等效的“on commit”触发器?
在向表中插入多行后,我想向外部进程发送一条消息,表明有行准备处理。使用语句级触发器会导致每个插入一条消息,我只想发送一条消息,说“有待处理的行。”
答案 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