CREATEORREPLACETRIGGER TR_BOM_AUTONUMBER_SEQNUMBER
BEFORE
INSERT ON BOM
REFERENCING NEW
AS NEW OLD
AS OLD
FOR EACH ROW
DECLARE tmpVar
number;
BEGIN tmpVar :
=0;
SELECT GREATEST(nvl(
Max(to_number(SEQ_NUMBER)),
0),
Count(
*))
+1INTO tmpVar
FROM BOM
Where BOMID
=:New.BOMID;
:NEW. SEQ_NUMBER:
= nvl(tmpVar,
1);
END TR_BOM_AUTONUMBER_SEQNUMBER;
由于Insert操作会修改表数据,所以Insert…Select插入多行数据时,会报ORA-04091: table string.string is mutating, trigger/function may not see it错误,原因在于插入第2条数据时表已修改不能再访问。
CREATEORREPLACE PACKAGE BOM_AUTONUMBER
IS TYPE t_MAX_SEQNUMBER
istableofnumberINDEXBY PLS_INTEGER;
v_MAX_SEQNUMBER t_MAX_SEQNUMBER;
end BOM_AUTONUMBER;
/
CREATEORREPLACETRIGGER TR_BOM_AUTONUMBER_SEQNUMBER
BEFORE
INSERT ON BOM
REFERENCING NEW
AS NEW OLD
AS OLD
FOR EACH ROW
DECLARE vNumber
number;
vBOMID
number;
BEGIN vNumber:
=0;
vBOMID:
= :New.BOMID;
ifnot BOM_AUTONUMBER.v_MAX_SEQNUMBER.
EXISTS(vBOMID)
then SELECT GREATEST(nvl(
Max(to_number(SEQ_NUMBER)),
0),
Count(
*))
INTO vNumber
FROM BOM
Where ITEM
= vBOMID;
BOM_AUTONUMBER.v_MAX_SEQNUMBER(vBOMID) :
= nvl(vNumber,
0);
endif;
BOM_AUTONUMBER.v_MAX_SEQNUMBER(vBOMID) :
= BOM_AUTONUMBER.v_MAX_SEQNUMBER(vBOMID)
+1;
:NEW.SEQ_NUMBER :
= BOM_AUTONUMBER.v_MAX_SEQNUMBER(vBOMID);
END TR_BOM_ AUTONUMBER_SEQNUMBER;
/