更新触发器,在调用函数时导致递归循环

时间:2016-06-20 08:17:27

标签: oracle recursion triggers

我创建了一个像这样的自我关系的表:

创建表组织(id,name,parent_id)

为了便于访问,我将组织二进制代码添加到表中,并在更改父级后添加用于更新组织二进制代码的触发器。 当我想要更新然后我做了递归循环并从oracle获取死锁。

我在单独的函数中更新代码并在触发器结束时调用它;  我像这样制作循环:

  1. 更新记录
  2. 运行触发器
  3. 更新组织代码
  4. 运行触发器
  5. 更新组织代码 等等。

1 个答案:

答案 0 :(得分:0)

  CREATE OR REPLACE TRIGGER TRG_Core_Organization_before
  before insert OR UPDATE on Core_Organization
 for each row

declare
-- local variables here
  parent_HIERARCHICODE number;
  PRAGMA AUTONOMOUS_TRANSACTION;

begin

  IF INSERTING OR (UPDATING AND :new.parentid != :old.parentid) OR
     (UPDATING AND :old.hierarchicode IS NULL) THEN
    Begin
      -- get last code in this root 

  --   RAISE_APPLICATION_ERROR(-20001,'ERROR HIERARCHICODE');

  select HIERARCHICODE
    into parent_HIERARCHICODE
    from Core_Organization cp
   where cp.id = :new.parentid;

  select NVL(max(HIERARCHICODE) + 1, parent_HIERARCHICODE || '001')
    into :new.hierarchicode
    from Core_Organization cp
   where cp.parentid = :new.parentid;

EXCEPTION
  WHEN NO_DATA_FOUND THEN
    :new.hierarchicode := cast(parent_HIERARCHICODE || '001' as number);
END;

  END IF;
end;