我创建了一个像这样的自我关系的表:
创建表组织(id,name,parent_id)
为了便于访问,我将组织二进制代码添加到表中,并在更改父级后添加用于更新组织二进制代码的触发器。 当我想要更新然后我做了递归循环并从oracle获取死锁。
我在单独的函数中更新代码并在触发器结束时调用它; 我像这样制作循环:
答案 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;