1

假设我们有以下触发器:

create or replace trigger TR_TEST  
for update or insert or delete  
  on TABLE_X  
compound trigger  
  type array is table of TABLE_X%rowtype index by binary_number;
  recs array;

  before each row is
    i number default rowids.count + 1;
  begin
    recs(i).a := nvl(:NEW.a, :OLD.a);
    recs(i).b := nvl(:NEW.b, :OLD.b);
    recs(i).c := nvl(:NEW.c, :OLD.c);
    recs(i).d := nvl(:NEW.d, :OLD.d);
  end before each row;

  after statement is
  begin
    -- Do procedure here that will throw an exception
  end after statement;

end TR_TEST;

当 after 语句抛出异常并且未处理时,数组的内容会发生什么?它会被自动清理还是会在整个会话期间保留在内存中?如果后者是真的,那么处理它以防止内存泄漏的正确方法是什么?谢谢!

4

2 回答 2

1

PL/SQL 会自动为您处理变量范围,您不必担心它(事实上,无论如何您都无法明确地做任何事情)。

在这种情况下,数组在触发器开始时分配(例如,当第一行被插入/更新/删除时),并一直保留到触发器结束(即在 after 语句部分完成之后,或者引发异常时)传播给调用者)。

当触发器超出范围时,数组将不再可访问,Oracle 可能会在以后自行决定释放用于它的内存。

于 2013-05-16T05:33:10.463 回答
-1

据我所知,如果触发器中抛出异常,则会完成回滚。

有关详细信息,请参阅http://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:482821541531

于 2013-05-15T12:36:20.270 回答