代码之家  ›  专栏  ›  技术社区  ›  Mark Harrison

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

  •  4
  • Mark Harrison  · 技术社区  · 15 年前

    在表中插入一些行之后,如何获得“on commit”触发器的等价物?

    4 回复  |  直到 15 年前
        1
  •  3
  •   HAL 9000    15 年前

    因为你需要触发一个 过程,看一下 DBMS_ALERT

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

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

        2
  •  7
  •   Jon Heller TenG    15 年前

    创建作业。在提交之前,它实际上不会被提交。(注意:DBMS\u调度程序通常比DBMS\u JOB好,但在这种情况下,您需要使用旧的DBMS\u 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;
    /
    
        3
  •  1
  •   Gary Myers    15 年前

    你可以设置一个标志来表示“我已经发送了消息”。

    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;
    
        4
  •  1
  •   Stephen Bealer    9 年前

    使用Oracle Advanced Queueing,您可以使用队列表上的侦听器将记录数组排队。

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