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; /