Oracle:如何在不延迟插入响应的情况下执行插入触发器?

时间:2009-08-07 13:13:40

标签: oracle http plsql triggers

下面的触发器是延迟我的插入响应。我该如何防止这种情况?

create or replace
TRIGGER GETHTTPONINSERT
BEFORE INSERT ON TABLENAME
FOR EACH ROW 
Declare
  --   
BEGIN
  -- The inserted data is transfered via HTTP to a remote location
END;

编辑人们告诉我要做批处理作业,但我宁愿让数据早于100%的一致性。触发器的优点是它会在数据到达时立即发生,但我无法承受插入响应延迟。

6 个答案:

答案 0 :(得分:10)

一种方法是让触发器创建一个dbms_job,它运行一次(每次)来执行http传输。 dbms_job的创建速度相对较快,您可以将其视为有效地并行生成新线程。

有关详细信息,请参阅http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:7267435205059 - 他的示例涉及发送电子邮件,但这个想法是一样的。

答案 1 :(得分:4)

对于称为数据库更改通知的这种确切情况,有一个完美的解决方案。

您可以将其视为异步触发器。

使用DBMS_Change_Notification包告诉oracle要观察哪些表以及发生更改时要执行的操作。您可以监视DML和DDL,您可以让Oracle批量更改(即等待10次更改在触发前发生)。它将使用包含已更改行的所有rowid的对象调用sproc ...您可以决定如何处理,包括调用HTTP。它不必完成提交的插入。 Documentation for 10gR2

答案 2 :(得分:3)

也许您可以创建一个本地表来存储您必须传输的信息,并创建一个每X分钟执行一次的作业。从表中读取的作业,传输所有数据并从表中删除传输的数据。

答案 3 :(得分:1)

是否可以使用Oracle复制选项?您通过http将插入的数据发送到after或before语句触发器中的远程位置。回滚时会发生什么?您的hhtp发送消息将不会回滚,因此您的数据不一致。

答案 4 :(得分:0)

很明显,您可以通过删除触发器来防止延迟.... 否则,触发器将始终在插入之前执行,这就是TRIGGER BEFORE INSERT的用途。

或者您可以向我们提供您需要的更多详细信息吗?

答案 5 :(得分:0)

如果您要在2020年以后解决这个问题,请查看DBMS_CQ_NOTIFICATION:

https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_CQ_NOTIFICATION.html