ORA-06512 - Mutating trigger

Here is the code:
CREATE OR REPLACE TRIGGER FPMENU00_update
AFTER UPDATE ON FPMENU00
REFERENCING OLD AS old
NEW AS new
FOR EACH ROW
BEGIN
UPDATE FPSMNU00
SET Menu_Name = :new.Menu_Name
WHERE Menu_Name = :old.Menu_Name;
END;
When I attempt to update the table FPMENU00, I am getting the error message:
(table fps.fpmenu00 is mutating, trigger/function may not see it ORA-06512: at "FPS.FPMENU00_UPDATE", line 2 ORA-04088: error during execution of trigger fps.fpmenu_update)
The Menu_Name also has a foreign key constraint on the FPSMNU00 table.
Is this not possible????
Thanks

A MUTATING TRIGGER is a case when you are updating a table, and the trigger fires. AND within that trigger itself you are firing another update to the same table. Oracle cannot handle that because it will create an infinite recursion of updates.
From your trigger body I see that
UPDATE FPSMNU00
SET Menu_Name = :new.Menu_Name
WHERE Menu_Name = :old.Menu_Name;
WHY ARE YOU DOING THAT?
Is it because any update to any column in that table should update the Menu_Name column? In any case the assignment Menu_Name = :new.Menu_Name is NOT REQUIRED. That is going to take place by itself.
Could you explain your scenario more.

Similar Messages

  • ORA-04091:table XYZ is mutating,trigger/function may not see it ORA-06512

    Hi everybody
    i am facing mutating problem during data deletion fron XYZ table as
    ORA-04091:table XYZ is mutating,trigger/function may not see it ORA-06512 at "user.procdure_name",line 39 ORA-065
    i have table XYZ and have database trigger on this table
    and also have procedure "user.abc" in this procedure m selecting data from xyz table

    You didn't post the actual code. I was more interested in seeing table name and the trigger body.
    Anyways, mutation problem comes when you refer the same table on the trigger, on which it is based for some data manipulation on that table.
    For e.g, If inside your trigger body, you are doing INSERT on the same table, then it'll definitely result in mutation problem because this trigger will be fired endlessly (as it is after insert trigger).
    Please mark answer as helpful / correct, if it helps you
    Navnit

  • ORA-04091: is mutating, trigger/function may not see

    I am getting this error
    ORA-04091: table SATURN.SARQUAN is mutating, trigger/function may not see it
    ORA-06512: at "BANINST1.F_GETSARQUANSEQNO", line 24
    ORA-06512: at "BANINST1.F_GETSARQUANSEQNO", line 30
    I am trying to do this insert
    INSERT INTO sarquan
                            (sarquan_pidm,sarquan_term_code_entry,sarquan_seqno,
                             sarquan_appl_no, sarquan_question,
                             sarquan_answer, sarquan_activity_date,
                             sarquan_user_id
                    SELECT spriden_pidm,'201090',BANINST1.F_GETSARQUANSEQNO(spriden_pidm,'201090','1'),'1',
                     'Would you prefer September admission?',
                    DECODE (szcasup_sept_adm, 'Y', 'Yes', 'N', 'No'),sysdate,'rmanoei'
               FROM saturn_midd.szcasup, saturn.spriden
              WHERE spriden_id = szcasup_common_appl_id
                AND spriden_ntyp_code = 'CAPP'
                AND (   szcasup_sept_adm IS NOT NULL
                     OR szcasup_feb_adm IS NOT NULL
                     OR szcasup_interview IS NOT NULL
                AND NOT EXISTS (
                       SELECT *
                         FROM  sarquan
                        WHERE sarquan_pidm = spriden_pidm
                          AND spriden_ntyp_code = 'CAPP'
                          AND sarquan_term_code_entry = '201090');
                          I got data when I ran just the select statement, none of the records have data in the sarquan table.
    I got data when I select from this function
    ,BANINST1.F_GETSARQUANSEQNO(spriden_pidm,'201090','1'),'1'
    Any ideas?
    Edited by: peace4all on Aug 12, 2009 4:49 PM

    I can not drop the trigger, I don't own the trigger, it is in production, SARQUAN is a production table
    Now I am getting this error ORA-04091: table SATURN.SARQUAN is mutating, trigger/function may not see it
    ORA-06512: at "BANINST1.F_GETSARQUANSEQNO", line 24
    ORA-06512: at "BANINST1.F_GETSARQUANSEQNO", line 30
    ORA-06512: at "SATURN.ST_SARQUAN_INSERT_ROW", line 2
    ORA-04088: error during execution of trigger 'SATURN.ST_SARQUAN_INSERT_ROW'
    when I do the following
    I know that this pidm does not have any records in the table SARQUAN
    spriden_pidm = 2287953
    So I try to do a simple insert, not using the function, now I am hardcoding the seq, I know it needs to be 1 since there are not records in that table yet,
    the sequence go by pidm
    INSERT INTO saturn.sarquan
                     sarquan_pidm,
                     sarquan_seqno,
                     sarquan_term_code_entry,
                     sarquan_appl_no,
                      sarquan_question,
                     sarquan_answer,
                     sarquan_activity_date,
                     sarquan_user_id
    SELECT spriden_pidm,'1',
    '201090','1',
                     'Would you prefer September admission?',
                    DECODE (szcasup_sept_adm, 'Y', 'Yes', 'N', 'No'),sysdate,'recheverri'
               FROM saturn_midd.szcasup, saturn.spriden
              WHERE spriden_id = szcasup_common_appl_id
                AND spriden_ntyp_code = 'CAPP'
                 and spriden_pidm = 2287953
                AND (   szcasup_sept_adm IS NOT NULL
                     OR szcasup_feb_adm IS NOT NULL
                     OR szcasup_interview IS NOT NULL
                AND NOT EXISTS (
                       SELECT *
                         FROM saturn.sarquan
                        WHERE sarquan_pidm = spriden_pidm
                          AND spriden_ntyp_code = 'CAPP'
                          AND sarquan_term_code_entry = '201090');
                          Edited by: peace4all on Aug 13, 2009 5:35 AM

  • How to get around ora-ORA-04091: table SSBOSS.SSTRMAST is mutating, trigger

    hi,
    Does anyone know how one would get around this problem please ?
    Here is my dbase trig:
    CREATE OR REPLACE TRIGGER SSBOSS.new_not_greater_than_net
    BEFORE INSERT OR UPDATE OF newrent ON SSBOSS.SSTRMAST
    REFERENCING NEW AS new OLD AS old
    FOR each row
    DECLARE
    not_permitted EXCEPTION;
    vnum number := ssboss.nik_f;
    BEGIN
    IF :new.NEWRENT > vnum then
    --AND :old.DELETED = 'N' THEN
    RAISE not_permitted;
    END IF;
    EXCEPTION
    WHEN not_permitted THEN
    RAISE_APPLICATION_ERROR
    (-20001, 'NEWRENT:'||:new.newrent||' '||'OLDRENT:'||' '||:old.netrent||'Action not permitted. Contribution (sstrmast.newrent) value '
    ||:new.NEWRENT
    ||' exceeds GROSS rental value (sstrmast.netrent) ');
    END;
    Here is my problem:
    SQL> update sstrmast set newrent = 11;
    update sstrmast set newrent = 11
    ERROR at line 1:
    ORA-04091: table SSBOSS.SSTRMAST is mutating, trigger/function may not see it
    ORA-06512: at "SSBOSS.NIK_F", line 4
    ORA-06512: at "SSBOSS.NEW_NOT_GREATER_THAN_NET", line 4
    ORA-04088: error during execution of trigger 'SSBOSS.NEW_NOT_GREATER_THAN_NET'
    I understand why but not how to correct?
    Thanks,
    nikolia.

    Hello,
    This problem as you might be knowing occurs when you try to select the data from the same table on which the trigger is written. Also this problem is only with the row level trigger and not with the statement level trigger. However the limitation of the statement level trigger is it can not refer to :NEW or :OLD. So now the solution is to capture the value of :NEW or :OLD in the row level trigger (no select statement here) and store it in some global variable. And how do you get the global variable? Using package specification ! a variable declared in a package specification is global in nature. Then use the value so stored in the statement level trigger in the select statement. It will work. Other solution is to use pragma autonomous transaction. Try and let us know. All the best.
    Regards

  • ORA-04091 table string.string is mutating, trigger/function may not see it

    When I am tending to delete something from my table I received this message.
    I defined a PL/SQL function reads data from that table. Is that meaning I could not modify anything in table once I have some PL/SQL defined on that? It sounds ridiculour. Or I missed some points?
    Anyone could help me out?
    Many thanks,
    Qiang

    In get_point_coordinates(point_id, layerid), it does not have any codes deleting thing from point_tab.
    Its functionality is to find out that specified point;
    put its coordinates into SDO_GEOMETRY object and return as function value.
    However, oracle does not allow me to delete any data from point table since then.It is saying that function (get_point_coordinates) can not know mutating tables.
    When I run delete task:
    delete from point$_view where point_id = 1;
    I got errors:
    ERROR at line 1:
    ORA-04091: table POINT$_TABLE is mutating, trigger/functio
    n may not see it
    ORA-06512: at "GET_POINT_COORDINATES", /* THIS LINE REPORS ERROR*/ Look at codes below.
    The following is code of function: GET_POINT_COORDINATES
    FUNCTION GET_POINT_COORDINATES(pPoint_ID IN NUMBER, player_ID IN NUMBER)
    RETURN MDSYS.SDO_GEOMETRY DETERMINISTIC IS
    PSRID NUMBER :=NULL:
    PLON NUMBER := NULL;
    PLAT NUMBER := NULL;
    CURSOR get_lonlat(ppoint_id IN NUMBER, player_id IN NUMBER) IS SELECT LON,LAT
    FROM POINT$_VIEW /* THIS LINE REPORS ERROR*/
    WHERE player_id = layer_id AND ppoint_id = point_id;
    BEGIN
    PSRID := 8265;
    OPEN get_lonlat(pPoint_ID,Player_ID);
    FETCH get_lonlat INTO PLON, PLAT;
    RETURN MDSYS.SDO_GEOMETRY(2001,PSRID,MDSYS.SDO_POINT_TYPE(PLON,PLAT,NULL),NULL ,NULL);
    END GET_POINT_GEOM;
    I guess it has nothing with foreign key. There is something wrong with this function.
    By the way, a spatail index is built on this function. Does this make any differences on this point?

  • ORA-04091: table AM is mutating, trigger/function may not see it

    I create this trigger:
    CREATE OR REPLACE TRIGGER pr_test
    after insert ON AM
    FOR EACH ROW
    declare
    appo_pr varchar2(64):= null;
    BEGIN
    select name
    into appo_pr
    from AS
    where AS_ID=:new.AS_ID;
    insert into AM (name) values (appo_pr);
    END pr_test;
    I insert before a new AS_ID and name in tab AS but when I insert a new record in tab AM I get this error:
    ORA-04091: table AM is mutating, trigger/function may not see it
    ORA-06512: at PR_TEST", line 11
    ORA-04088: error during execution of trigger PR_TEST'
    I'd like to create a trigger that when I insert a new record in AM It verify the value in col name of AS and insert this value in col name of AM.
    What I wrong in this trigger??
    How can I modify it??
    Thanks
    Raf

    Try this:
    CREATE OR REPLACE TRIGGER pr_test
      before insert ON AM
      FOR EACH ROW
    declare
      appo_pr AS.name%TYPE;
    BEGIN
      select name
      into   appo_pr
      from   AS
      where  AS_ID = :new.AS_ID;
      :new.name = appo_pr;
    END pr_test;

  • ORA-04091: table blah is mutating, trigger/function may not see it

    ORA-04091: table blah is mutating, trigger/function may not see it
    ORA-06512: at "AOLALERE.CHK_FOR_POST", line 7
    ORA-06512: at "AOLALERE.CHK_FOR_POST", line 20
    ORA-06512: at "AOLALERE.PREPRODDTA_F41021_AFTER_UPDATE", line 14
    ORA-04088: error during execution of trigger 'AOLALERE.PREPRODDTA_F41021_AFTER_UPDATE'
    TRIGGER preproddta_f41021_after_update
    after insert or update
    on preproddta.f41021
    for each row
    declare
    --nothing to declare
         --pragma autonomous_transaction;
         l_lipqoh preproddta.f41021.lipqoh%type;
         l_lipcom preproddta.f41021.lipcom%type;
         l_lihcom preproddta.f41021.lihcom%type;
         l_lilots preproddta.f41021.lilots%type;
         l_lilocn preproddta.f41021.lilots%type;
         l_lilotn preproddta.f41021.lilots%type;
    l_quantity_avail f41021_audit.quantity_avail%type;
         l_rec_chk f41021_audit.liitm%type;
    begin
    --chk_for_post(:new.limcu,:new.liitm);
    --if :old.limcu <> '      GBD001' then return; end if;
    if :old.lipqoh = :new.lipqoh then
    l_lipqoh := :old.lipqoh;
    else
    l_lipqoh := :new.lipqoh;
    end if;
    if :old.lipcom = :new.lipcom then
    l_lipcom := :old.lipcom;
    else
    l_lipcom := :new.lipcom;
    end if;
    if :old.lihcom = :new.lihcom then
    l_lihcom := :old.lihcom;
    else
    l_lihcom := :new.lihcom;
    end if;
    if :old.lilots = :new.lilots then
    l_lilots := :old.lilots;
    else
    l_lilots := :new.lilots;
    end if;
    if l_lilots <> ' ' then
    l_quantity_avail := - (l_lipcom - l_lihcom);
    else
    l_quantity_avail := l_lipqoh - (l_lipcom + l_lihcom);
    end if;
    l_rec_chk := rec_chk(:old.limcu,:old.liitm,l_lilots);
    if l_rec_chk is not null then
         begin
    update f41021_audit
         set lipqoh = l_lipqoh,
         lipcom = l_lipcom,
    lihcom = l_lihcom,
              quantity_avail = l_quantity_avail
         where limcu = :old.limcu
         and liitm = :old.liitm
         and lilotn = :old.lilotn
         and lilocn = :old.lilocn
         and lilots = l_lilots;
         end;
    else
    -- insert record into audit table
    begin
    insert into f41021_audit
    (limcu,
                        liitm,
                                  lipqoh,
                                  lipcom,
                                  lihcom,
                                  lilots,
                                       lilotn,
                                       lilocn,
                                       quantity_avail)
    values
    (:old.limcu,
    :old.liitm,
    l_lipqoh,
                                  l_lipcom,
                                  l_lihcom,
                                  l_lilots,
                                       :old.lilotn,
                                       :old.lilocn,
                                       l_quantity_avail);
         end;
    end if;
    end;
    create or replace procedure chk_for_post(p_limcu in varchar2,
    p_liitm in number)
    is
    cursor get_bra_qa(p_limcu in varchar2,
    p_liitm in number)is
    select liitm,
         (sum(lipqoh) - sum(lipcom + lihcom)) qual_avail
    from preproddta.f41021 a, preproddta.f4101 b
    where limcu = p_limcu
    and liitm = imitm
    and liitm = p_liitm
    group by liitm,imdsc1;
    l_bra_qa get_bra_qa%rowtype;
    l_itm_bran_qa t_f41021_itm_bran_qa := t_f41021_itm_bran_qa.initialize(p_liitm);
    begin
    open get_bra_qa(p_limcu,p_liitm);
    fetch get_bra_qa into l_bra_qa;
    close get_bra_qa;
    if l_itm_bran_qa.quantity_avail is null then ---This indicate that there is no record for
    ---quantity available for the item based on the branch .
    l_itm_bran_qa := new t_f41021_itm_bran_qa(p_liitm);
         begin
         l_itm_bran_qa.liitm := p_liitm;
         l_itm_bran_qa.limcu := p_limcu;
         l_itm_bran_qa.quantity_avail := l_bra_qa.qual_avail;
         l_itm_bran_qa.add_it;
         commit;
         end;     
    else
    l_itm_bran_qa := t_f41021_itm_bran_qa.initialize(p_liitm);
         if l_itm_bran_qa.quantity_avail = l_bra_qa.qual_avail then
         null; return;
         else
         begin
         l_itm_bran_qa.liitm := p_liitm;
         l_itm_bran_qa.limcu := p_limcu;
         l_itm_bran_qa.quantity_avail := l_bra_qa.qual_avail;
         l_itm_bran_qa.send_to_DB;
         commit;
         end;
         end if;     
    end if;
    end;

    Thanks,
    I comment it out cos it was causing the problem this is the code:
    The following error has occurred:
    ORA-04091: table PREPRODDTA.F41021 is mutating, trigger/function may not see it
    ORA-06512: at "AOLALERE.CHK_FOR_POST", line 7
    ORA-06512: at "AOLALERE.CHK_FOR_POST", line 20
    ORA-06512: at "AOLALERE.PREPRODDTA_F41021_AFTER_UPDATE", line 98
    ORA-04088: error during execution of trigger 'AOLALERE.PREPRODDTA_F41021_AFTER_UPDATE'
    TRIGGER preproddta_f41021_after_update
    after insert or update
    on preproddta.f41021
    for each row
    declare
    --nothing to declare
         --pragma autonomous_transaction;
         l_lipqoh preproddta.f41021.lipqoh%type;
         l_lipcom preproddta.f41021.lipcom%type;
         l_lihcom preproddta.f41021.lihcom%type;
         l_lilots preproddta.f41021.lilots%type;
         l_lilocn preproddta.f41021.lilots%type;
         l_lilotn preproddta.f41021.lilots%type;
    l_quantity_avail f41021_audit.quantity_avail%type;
         l_rec_chk f41021_audit.liitm%type;
    begin
    --if :old.limcu <> '      GBD001' then return; end if;
    if :old.lipqoh = :new.lipqoh then
    l_lipqoh := :old.lipqoh;
    else
    l_lipqoh := :new.lipqoh;
    end if;
    if :old.lipcom = :new.lipcom then
    l_lipcom := :old.lipcom;
    else
    l_lipcom := :new.lipcom;
    end if;
    if :old.lihcom = :new.lihcom then
    l_lihcom := :old.lihcom;
    else
    l_lihcom := :new.lihcom;
    end if;
    if :old.lilots = :new.lilots then
    l_lilots := :old.lilots;
    else
    l_lilots := :new.lilots;
    end if;
    if l_lilots <> ' ' then
    l_quantity_avail := - (l_lipcom - l_lihcom);
    else
    l_quantity_avail := l_lipqoh - (l_lipcom + l_lihcom);
    end if;
    l_rec_chk := rec_chk(:old.limcu,:old.liitm,l_lilots);
    if l_rec_chk is not null then
         begin
    update f41021_audit
         set lipqoh = l_lipqoh,
         lipcom = l_lipcom,
    lihcom = l_lihcom,
              quantity_avail = l_quantity_avail
         where limcu = :old.limcu
         and liitm = :old.liitm
         and lilotn = :old.lilotn
         and lilocn = :old.lilocn
         and lilots = l_lilots;
         end;
    else
    -- insert record into audit table
    begin
    insert into f41021_audit
    (limcu,
                        liitm,
                                  lipqoh,
                                  lipcom,
                                  lihcom,
                                  lilots,
                                       lilotn,
                                       lilocn,
                                       quantity_avail)
    values
    (:old.limcu,
    :old.liitm,
    l_lipqoh,
                                  l_lipcom,
                                  l_lihcom,
                                  l_lilots,
                                       :old.lilotn,
                                       :old.lilocn,
                                       l_quantity_avail);
         end;
    end if;
    chk_for_post(:new.limcu,:new.liitm);
    return;
    end;
    create or replace procedure chk_for_post(p_limcu in varchar2,
    p_liitm in number)
    is
    cursor get_bra_qa(p_limcu in varchar2,
    p_liitm in number)is
    select liitm,
    (sum(lipqoh) - sum(lipcom + lihcom)) qual_avail
    from preproddta.f41021 a, preproddta.f4101 b
    where limcu = p_limcu
    and liitm = imitm
    and liitm = p_liitm
    group by liitm,imdsc1;
    l_bra_qa get_bra_qa%rowtype;
    l_itm_bran_qa t_f41021_itm_bran_qa := t_f41021_itm_bran_qa.initialize(p_liitm);
    begin
    open get_bra_qa(p_limcu,p_liitm);
    fetch get_bra_qa into l_bra_qa;
    close get_bra_qa;
    if l_itm_bran_qa.quantity_avail is null then ---This indicate that there is no record for
    ---quantity available for the item based on the branch .
    l_itm_bran_qa := new t_f41021_itm_bran_qa(p_liitm);
    begin
    l_itm_bran_qa.liitm := p_liitm;
    l_itm_bran_qa.limcu := p_limcu;
    l_itm_bran_qa.quantity_avail := l_bra_qa.qual_avail;
    l_itm_bran_qa.add_it;
    commit;
    end;
    else
    l_itm_bran_qa := t_f41021_itm_bran_qa.initialize(p_liitm);
    if l_itm_bran_qa.quantity_avail = l_bra_qa.qual_avail then
    null; return;
    else
    begin
    l_itm_bran_qa.liitm := p_liitm;
    l_itm_bran_qa.limcu := p_limcu;
    l_itm_bran_qa.quantity_avail := l_bra_qa.qual_avail;
    l_itm_bran_qa.send_to_DB;
    commit;
    end;
    end if;
    end if;
    end;
    Please sugesst any work around. I need to call calculate changes based on the insert or updates

  • ORA-04091: table is mutating, trigger/function may no

    Hi all,
    I'm trying to create a trigger, but I got the following:
    ERROR at line 1:
    ORA-04092: cannot ROLLBACK in a trigger
    ORA-06512: at "PKG_PROJ", line 63
    ORA-04091: table TBL_DATA is mutating, trigger/function may not see it
    ORA-06512: at "T$D_INS_TDATA", line 4
    ORA-04088: error during execution of trigger 'T$D_INS_TDATA'My trigger is:
    CREATE OR REPLACE TRIGGER T$D_INS_TDATA
           AFTER INSERT ON TBL_DATA
           FOR EACH ROW
    DECLARE
    BEGIN
         PKG_PROJ.P$INSERT(:NEW.ID);
         COMMIT;
    END;
    /Where meu procedure is:
           PROCEDURE P$INSERT
               P_ID      IN TBL_DATA.ID%TYPE
           AS
           BEGIN
                INSERT INTO TBL_DETAIL
                    ID_DETAIL,           DT_DETAIL, OBS,
                SELECT SEQ_DETAIL.NEXTVAL, SYSDATE, 'INSERT TRIGGER TEST'
                FROM TBL_DATA DC
                AND   DC.ID    =  P_ID
                COMMIT WORK;
            EXCEPTION
                     WHEN OTHERS THEN
                         ROLLBACK;
                         RAISE_APPLICATION_ERROR(-20102, 'PKG_PROJ.P$INSERT: ' || SQLERRM);
           END P$INSERT;Somebody can help me???
    thanx!!!! :-)

    Tad,
    I believe you're performing SELECT on the triggering table in the PL/SQL block. In simple words, you're trying to change the information of a table the TRIGGER is created for and you're trying to read data from the same table.
    I suggest that you use PL/SQL pragma autonomous_transaction to resolve this, for as per Oracle documentation "The AUTONOMOUS_TRANSACTION pragma instructs the PL/SQL compiler to mark a routine as autonomous (independent). An autonomous transaction is an independent transaction started by another transaction, the main transaction. Autonomous transactions let you suspend the main transaction, do SQL operations, commit or roll back those operations, then resume the main transaction."
    Furthermore, you can also refer to the following discussion by Thomas Kyte for further understanding of mutating tables:
    Avoiding Mutating Tables
    http://asktom.oracle.com/tkyte/Mutate/
    Hope this helps.
    Regards,
    Naveed.

  • ORA-04091: table ...is mutating, trigger/function may

    when I run a delete on this table I have the error
    ORA-04091: table MICRODEV.T086_LIEN_INSC is mutating, trigger/function may not see it
    ORA-06512: at "MICRODEV.TG_DEL_T086_LIEN_INSC", line 5
    ORA-04088: error during execution of trigger 'MICRODEV.TG_DEL_T086_LIEN_INSC'
    How Can I workaround it
    CREATE OR REPLACE TRIGGER "MICRODEV"."TG_DEL_T086_LIEN_INSC"
    BEFORE
    DELETE ON "MICRODEV"."T086_LIEN_INSC" FOR EACH ROW DECLARE lNbRows NUMBER(1);
    BEGIN
    IF :OLD.CO_PART_DNOM_SOC = 'DS' THEN
    SELECT 1 INTO lNbRows
    FROM T086_LIEN_INSC
    WHERE NO_SEQ_LIEN_DNOM = :OLD.NO_SEQ_LIEN_INSC
    AND NO_INSC = :OLD.NO_INSC
    AND CO_PART_DNOM_SOC <> 'PA';
    IF lNbRows = 1 THEN
    raise_application_error(-20100, 'TRIGGER On Delete (T086_LIEN_INSC)');
    END IF;
    SELECT 2 INTO lNbRows
    FROM T086_LIEN_INSC
    WHERE NO_SEQ_LIEN_DNOM = :OLD.NO_SEQ_LIEN_INSC
    AND NO_INSC = :OLD.NO_INSC
    AND CO_PART_DNOM_SOC = 'PA';
    IF lNbRows = 2 THEN
    raise_application_error(-20101, 'TRIGGER On Delete (T086_LIEN_INSC)');
    END IF;
    END IF;
    END;

    when I run a delete on this table I have the error
    ORA-04091: table MICRODEV.T086_LIEN_INSC is mutating, trigger/function may not see it
    ORA-06512: at "MICRODEV.TG_DEL_T086_LIEN_INSC", line 5
    ORA-04088: error during execution of trigger 'MICRODEV.TG_DEL_T086_LIEN_INSC'
    How Can I workaround it
    CREATE OR REPLACE TRIGGER "MICRODEV"."TG_DEL_T086_LIEN_INSC"
    BEFORE
    DELETE ON "MICRODEV"."T086_LIEN_INSC" FOR EACH ROW DECLARE lNbRows NUMBER(1);
    BEGIN
    IF :OLD.CO_PART_DNOM_SOC = 'DS' THEN
    SELECT 1 INTO lNbRows
    FROM T086_LIEN_INSC
    WHERE NO_SEQ_LIEN_DNOM = :OLD.NO_SEQ_LIEN_INSC
    AND NO_INSC = :OLD.NO_INSC
    AND CO_PART_DNOM_SOC <> 'PA';
    IF lNbRows = 1 THEN
    raise_application_error(-20100, 'TRIGGER On Delete (T086_LIEN_INSC)');
    END IF;
    SELECT 2 INTO lNbRows
    FROM T086_LIEN_INSC
    WHERE NO_SEQ_LIEN_DNOM = :OLD.NO_SEQ_LIEN_INSC
    AND NO_INSC = :OLD.NO_INSC
    AND CO_PART_DNOM_SOC = 'PA';
    IF lNbRows = 2 THEN
    raise_application_error(-20101, 'TRIGGER On Delete (T086_LIEN_INSC)');
    END IF;
    END IF;
    END;

  • ORA-04091: table  is mutating, trigger/function

    I am using oracle 11g R2 - 11.2.0.1
    I have following function to fetch the ID from name supplied
    create or replace
    FUNCTION get_group_id
    (p_groupname IN group_list.groupname%TYPE)
    RETURN group_list.group_id%TYPE
    AS
    v_group_id group_list.group_id%TYPE;
    BEGIN
    SELECT group_list.group_id
    INTO v_group_id
    FROM group_list
    WHERE group_list.groupname = p_groupname;
    RETURN v_group_id;
    END get_group_id;
    and I am doing simple update command to the table, but its giving me ORA-04091 error. Any help is appreciated
    update GROUP_LIST set MGR_GROUP_ID = get_group_id('manager1') where group_id = get_group_id('employee51');
    Error which I am getting is -
    Error report:
    SQL Error: ORA-04091: table is mutating, trigger/function may not see it
    ORA-06512: at "GET_GROUP_ID", line 7
    04091. 00000 - "table %s.%s is mutating, trigger/function may not see it"
    *Cause:    A trigger (or a user defined plsql function that is referenced in
    this statement) attempted to look at (or modify) a table that was
    in the middle of being modified by the statement which fired it.
    *Action:   Rewrite the trigger (or function) so it does not read that table.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       

    >
    and I am doing simple update command to the table, but its giving me ORA-04091 error. Any help is appreciated
    update GROUP_LIST set MGR_GROUP_ID = get_group_id('manager1') where group_id = get_group_id('employee51');
    Error which I am getting is -
    Error report:
    SQL Error: ORA-04091: table is mutating, trigger/function may not see it
    >
    And do you have a trigger on the GROUP_LIST table that calls you function that queries the GROUP_LIST table?
    The solution is simple: DON'T DO THAT!
    See Trigger Restrictions on Mutating Tables in the SQL Language doc
    http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/triggers.htm#g1699708
    Trigger Restrictions on Mutating Tables
    A mutating table is a table that is being modified by an UPDATE, DELETE, or INSERT statement, or a table that might be updated by the effects of a DELETE CASCADE constraint.
    The session that issued the triggering statement cannot query or modify a mutating table. This restriction prevents a trigger from seeing an inconsistent set of data.
    This restriction applies to all triggers that use the FOR EACH ROW clause. Views being modified in INSTEAD OF triggers are not considered mutating.
    When a trigger encounters a mutating table, a run-time error occurs, the effects of the trigger body and triggering statement are rolled back, and control is returned to the user or application. (You can use compound triggers to avoid the mutating-table error. For more information, see Using Compound Triggers to Avoid Mutating-Table Error.)
    Consider the following trigger:
    CREATE OR REPLACE TRIGGER Emp_count
    . . .

  • Trigger error in a call store procedure (ORA-06512)

    Hi all,
    I have a trigger (TRLFACTSIN) that update stock when delete, insert or update a record in a sales table. Inside the trigger call a store procedure (PCALCULASTOCK2), he is the manager of calculating and update the stock .
    Any idea?, Thanks
    Error description:
    UPDATE "ALCAR"."LFACTSIN" SET CANTIDAD = '10' WHERE ROWID = 'AAA0D9AAAAAACvdAAA'
    One error saving changes to table "ALCAR"."LFACTSIN":
    Row 7: ORA-04091: table ALCAR.LFACTSIN is mutating, trigger/function may not see it
    ORA-06512: at "ALCAR.PCALCULASTOCK2", line 114
    ORA-06512: at "ALCAR.TRLFACTSIN", line 31
    ORA-04088: error during execution of trigger 'ALCAR.TRLFACTSIN'
    Trigger DDL:
    create or replace
    Trigger trLFACTSIN
    AFTER INSERT OR DELETE OR UPDATE ON LFACTSIN
    for each row
    Declare
    darticulo varchar2(13);
    resultado integer default 0;
    bEjecutar boolean default True;
    ofic1 char(1);
    begin
    if (inserting) then
    darticulo := :new.cod_articulo;
    ofic1 := :new.oficial;
    end if;
    If (deleting) Then
    darticulo := :old.cod_articulo;
    ofic1 := :old.oficial;
    end if;
    If (Updating) Then
    -- En el caso que sea actualización miramos si la se modificó la cantidad
    if :old.cantidad = :new.cantidad Then
    darticulo := '';
    bEjecutar := False;
    else
    darticulo := :new.cod_articulo;
    ofic1 := :new.oficial;
    end if;
    end if;
    --Ejecutamos el procedimiento almacenado para actualizar el stock en el semielaborado
    If bEjecutar Then
    --Comprobamos si es semielaborados
    Select Count(*) into resultado from semielab Where cod_semielab = darticulo;
    -- Ejecutamos el procedimiento almacenado que calcula y actualiza el stock para el semielaborado
    If resultado <> 0 Then
    PCALCULASTOCK2(darticulo, ofic1);
    resultado:=0;
    end if;
    End If;
    End;

    Whilst the table with the trigger on it is in the middle of a transaction you cannot select or use DML against it. This is what Oracle calls a "mutating table". It doesn't make sense to try and use a table that is in the middle of changing.
    You can use an autonomous transaction to work around this issue, but you should be careful with autonomous transactions because there are drawbacks relating to maintaining transaction consistency. Effectively it means you will be making alterations to B based on the fact that A has happened, but the transaction on B will not get rolled back if A fails at any point which could leave you with A not complete but B complete, hence the inconsistency.

  • ORA-00604/ORA-01422/ORA-06512 Error on trigger

    Hi,
    I have an database which is of version 10.2.0.3.0 on Enterprise Edition.
    I want to restrict a user from usage of an schema . Therefore i have written a trigger but i have encountered with another errors:
    ORA-00604: error occurred at recursive SQL level 1
    ORA-01422: exact fetch returns more than requested number of rows
    ORA-06512: at line 5
    Trigger Being::
    SQL> create or replace trigger session_access
    2 after logon on database
    3 declare
    4 v_username varchar2(30);
    5 v_osuser varchar2(30);
    6 begin
    7 select username,osuser into v_username,v_osuser from v$session;
    8 if v_username = 'SUSANJO' and v_osuser= 'ORACLE' then
    9 raise_application_error (-20001,'Access restricted for this USER');
    10 end if;
    11 end;
    12 /
    Trigger created.
    SQL> show errors;
    No errors.
    SQL> connect susanjo
    Enter password:
    ERROR:
    ORA-00604: error occurred at recursive SQL level 1
    ORA-01422: exact fetch returns more than requested number of rows
    ORA-06512: at line 5
    Warning: You are no longer connected to ORACLE.
    i have run out of ideas of whats to be done onto the trigger now.
    Regards.
    Susan John

    Um , i have implemented the following pl/sql. It seem to kick the person out BUT (now this is a big BUT) within the grid control it mentions :
    Details          Failed to connect to database instance: ORA-00604: error occurred at recursive SQL level 1.
    create or replace trigger session_access
    DECLARE
    v_username sys.v_$session.username%type;
    v_osuser sys.v_$session.osuser%type;
    BEGIN
    select s.username ,s.osuser into v_username,v_osuser
    from v$session s where s.username='SUSANJO' and s.osuser='oracle';
    IF (v_username ='SUSANJO' AND V_OSUSER='oracle' )
    THEN
    RAISE_APPLICATION_ERROR(-20001, 'You are not allowed to login using the program');
    END IF;
    END session_access;
    Output :
    SQL*Plus: Release 10.2.0.3.0 - Production on Mon Mar 23 12:36:43 2009
    Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
    Connected to:
    Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
    With the Partitioning and Data Mining options
    SQL> connect susanjo
    Enter password:
    ERROR:
    ORA-00604: error occurred at recursive SQL level 1
    ORA-20001: You are not allowed to login using the program
    ORA-06512: at line 10
    Warning: You are no longer connected to ORACLE.
    SQL>
    I did conduct a research which was not all that helpful too. So i am back to square one again.
    regards
    Susan John

  • Rgding ORA-04091:table PURCHSE_DTL is mutating,trigger/function maynot c it

    I wrote a trigger 'TRG_PURCHASE_DTL' to update the stock table 'BRANCH_ITEM_STOCK' based on the DML actions perfomed on tables PURCHASE_DTL and ISSUE_DTL, but I am getting following error:-
    ORA-04091: table PURCHASE_DTL is mutating, trigger/function may not see it
    and the value of 'BRANCH_ITEM_STOCK.purchase_qty' is updated to 10 instead of 18.
    The table structure and data is given below:
    -- ============================================================
    -- Table: BRANCH_ITEM_STOCK
    -- ============================================================
    create table BRANCH_ITEM_STOCK
    BRANCH_CODE NUMBER(6) not null,
    ITEM_CODE NUMBER(6) not null,
    PURCHASE_QTY NUMBER(6) null ,
    RECEIPT_QTY NUMBER(6) null ,
    ISSUE_QTY NUMBER(6) null ,
    BALANCE_QTY NUMBER(6) null ,
    REMARKS VARCHAR2(100) null ,
    constraint PK_RA25_BRANCH_ITEM_STOCK primary key (BRANCH_CODE, ITEM_CODE)
    -- ============================================================
    -- Table: PURCHASE_MST
    -- ============================================================
    create table PURCHASE_MST
    BRANCH_CODE NUMBER(6) not null,
    PURCHASE_YR NUMBER(6) not null,
    PURCHASE_NO NUMBER(6) not null,
    PURCHASE_DT DATE not null,
    QUOTATION_NO NUMBER(6) not null,
    QUOTATION_YR NUMBER(4) not null,
    VENDOR_CODE NUMBER(6) not null,
    RECEIPT_NO VARCHAR2(25) null ,
    constraint PK_PURCHASE_HDR primary key (BRANCH_CODE, PURCHASE_YR, PURCHASE_NO)
    -- ============================================================
    -- Table: PURCHASE_DTL
    -- ============================================================
    create table PURCHASE_DTL
    BRANCH_CODE NUMBER(6) not null,
    PURCHASE_YR NUMBER(6) not null,
    PURCHASE_NO NUMBER(6) not null,
    REC_SNO NUMBER(6) not null,
    ITEM_CODE NUMBER(6) not null,
    ITEM_QTY NUMBER(6) not null,
    ITEM_PRICE NUMBER not null,
    ITEM_AMT NUMBER not null,
    constraint PK_PURCHASE_DTL primary key (BRANCH_CODE, PURCHASE_YR, PURCHASE_NO, REC_SNO)
    -- ============================================================
    -- Table: ISSUE_MST
    -- ============================================================
    create table ISSUE_HDR
    BRANCH_CODE NUMBER(6) not null,/* Issued from Branch*/
    ISSUE_YR NUMBER(6) not null,
    ISSUE_NO NUMBER(6) not null,
    ISSUE_DT DATE not null,
    ISSUED_BY VARCHAR2(15) not null,
    ISSUED_TO_BRANCH VARCHAR2(15) not null,
    ISSUE_STATUS NUMBER(6) null,
    constraint PK_ISSUE_HDR primary key (BRANCH_CODE, ISSUE_YR, ISSUE_NO)
    -- ============================================================
    -- Table: ISSUE_DTL
    -- ============================================================
    create table ISSUE_DTL
    BRANCH_CODE NUMBER(6) not null,
    ISSUE_YR NUMBER(6) not null,
    ISSUE_NO NUMBER(6) not null,
    REC_SNO VARCHAR2(25) not null,
    ITEM_CODE NUMBER(6) not null,
    ITEM_DTL VARCHAR2(400) null ,
    ITEM_QTY NUMBER(6) null ,
    RECEIPT_QTY NUMBER(6) null ,
    constraint PK_RA25_ISSUE_DTL primary key (BRANCH_CODE, ISSUE_YR, ISSUE_NO, REC_SNO)
    Assume that the Contents of PURCHASE_MST is as follows:
    SELECT branch_code, purchase_yr, purchase_no FROM PURCHASE_HDR;
    BRANCH_CODE PURCHASE_YR PURCHASE_NO     
    100          2008          1     
    100          2009          1     
    100          2009          2     
    Now I tried to insert follwing values to the PURCHASE_DTL table:
    insert into purchase_dtl (BRANCH_CODE,PURCHASE_YR,PURCHASE_NO,rec_sno,
    ITEM_CODE,item_QTY)
    Values (100,2008,1,1,4,5)
    insert into purchase_dtl (BRANCH_CODE,PURCHASE_YR,PURCHASE_NO,rec_sno,
    ITEM_CODE,item_QTY)
    Values (100,2009,1,1,4,2)
    insert into purchase_dtl (BRANCH_CODE,PURCHASE_YR,PURCHASE_NO,rec_sno,
    ITEM_CODE,item_QTY)
    Values (100,2009,2,1,4,6)
    commit
    Now Contents of table ' PURCHASE_DTL ' is as follows:
    BRANCH_CODE PURCHASE_YR PURCHASE_NO     REC_SNO ITEM_CODE     ITEM_QTY
    100          2008          1     1          4     5
    100          2009          1     1          4     2
    100          2009          2     1          4     6
    I want to write a trigger which will insert/update/delete data into/from BRANCH_ITEM_STOCK,
    so that the contents of column Purchase_qty of table BRANCH_ITEM_STOCK should be as follows:
    BRANCH_CODE     ITEM_CODE     PURCHASE_QTY     RECEIPT_QTY     ISSUE_QTY     BALANCE_QTY
    100          4          13          0          0          13
    [Note:  i.e BRANCH_ITEM_STOCK.PURCHASE_QTY = SUM(PURCHASE_DTL.item_qty) 
         where PURCHASE_DTL.branch_code=100
         AND PURCHASE_DTL.item_code=4
    Now run the following update statement.
    update purchase_dtl
    set item_qty= 10
    where BRANCH_code=100
    and purchase_yr in ( 2008) and purchase_no =1 and rec_sno = 1 AND item_code = 4
    commit
    Now the actual contents of column Purchase_qty of table BRANCH_ITEM_STOCK should be updated as follows:
    BRANCH_CODE     ITEM_CODE     PURCHASE_QTY     RECEIPT_QTY     ISSUE_QTY     BALANCE_QTY
    100          4          18          0          0          18
    But I am facing problem here. I am getting following error:-
    ORA-04091: table PURCHASE_DTL is mutating, trigger/function may not see it
    and the value of purchase qty is updated to 10 instead of 18
    Similarly if any issue of items happen (for eg:- issue_qty=2 to branch_code 200), then the purchase_qty =18,issue_qty=2 , balance_qty:=18-2=16 .
    So for branch_code 200 , receipt_qty = 2.
    Pls help me how to achieve the above .
    Source code which I tried is given below : (but confused at the end )..please help
    CREATE OR REPLACE TRIGGER trg_purchase_dtl
    BEFORE INSERT ON PURCHASE_DTL
    for each row
    declare
    -- local variables here
    l_qty number(6);
    l_cnt NUMBER;
    BEGIN
    BEGIN
    SELECT COUNT(*) into l_cnt
    FROM BRANCH_item_stock b
    WHERE b.BRANCH_code = :new.BRANCH_code
    AND b.item_code = :new.item_code ;
    dbms_output.put_line('1.after selet cnt= '||l_cnt);
    EXCEPTION when no_data_found then
    l_cnt := 0;
    dbms_output.put_line('2.in expt NDF selet cnt= '||l_cnt);
    null;
    END;
    IF INSERTING THEN
    dbms_output.put_line('3.before if ...going to insert ');
    IF l_cnt = 0 THEN
    dbms_output.put_line('hihhiii.......lcnt=0...item_code='||:old.item_code||'~l_qty='||l_qty);
    IF INSERTING THEN
         INSERT INTO BRANCH_ITEM_STOCK
    (BRANCH_code,Item_Code, PURCHASE_QTY,RECEIPT_QTY, issue_qty, balance_qty)
         VALUES(:NEW.BRANCH_code,:NEW.Item_Code, :NEW.ITEM_QTY,0, 0, 0);
    END IF;
    ELSIF l_cnt >0 THEN
    SELECT purchase_qty into l_qty
    FROM BRANCH_Item_Stock
    WHERE BRANCH_code = :new.BRANCH_code
    AND item_code = :new.item_code ;
    l_qty := l_qty + :NEW.ITEM_QTY;
    dbms_output.put_line('6.after selet qty= '||l_qty ||'~new qty='||:NEW.ITEM_QTY||'~old qty='||:OLD.ITEM_QTY);
    dbms_output.put_line('7.before update '||l_qty);
    -- IF INSERTING OR UPDATING THEN
    UPDATE BRANCH_ITEM_STOCK
              SET PURCHASE_QTY = l_qty
              WHERE BRANCH_code = :new.BRANCH_code
    AND item_code = :new.item_code ;
    dbms_output.put_line('8.after update= '||l_qty);
    --END IF;
    END IF;
    END IF; -- end of INSERTING
    -- END;
    --EXCEPTION WHEN DUP_VAL_ON_INDEX THEN
         IF UPDATING THEN
              dbms_output.put_line('9.if UPDATING...qty= '||l_qty ||'~new qty='||:NEW.ITEM_QTY||'~old qty='||:OLD.ITEM_QTY);
    BEGIN
    dbms_output.put_line('~old unotcode='||:old.BRANCH_code||'~old.item_code='||:OLD.ITEM_CODE||'~old itemqty='||:old.item_qty);
    dbms_output.put_line('~new unotcode='||:new.BRANCH_code||'~new.item_code='||:new.ITEM_CODE||'~new itemqty='||:new.item_qty);
    SELECT NVL(SUM(item_qty), 0) into l_qty
         FROM Ra25_Purchase_Dtl
         WHERE BRANCH_code IN ( :old.BRANCH_code )
         AND item_code in ( :old.item_code)
         AND item_qty <> :old.item_code ;
    EXCEPTION WHEN OTHERS THEN
    dbms_output.put_line('10.in EWO'||sqlerrm);
    END;
    --l_qty := l_qty + :NEW.ITEM_QTY;         
    dbms_output.put_line('11.after selet qty= '||l_qty ||'~new qty='||:NEW.ITEM_QTY||'~old qty='||:OLD.ITEM_QTY);
         UPDATE BRANCH_ITEM_STOCK
              SET PURCHASE_QTY = l_qty      --:new.item_qty
              WHERE BRANCH_code = :old.BRANCH_code
              AND item_code = :old.item_code ;
              dbms_output.put_line('13.after update ');
         END IF;
    IF DELETING THEN
    DELETE FROM BRANCH_ITEM_STOCK
    WHERE BRANCH_CODE = :OLD.BRANCH_code
    AND ITEM_CODe = :OLD.item_code;
    END IF;
    end trg_purchase_dtl;
    Please help me how to resolve this problem asap.
    -------------------------------------------------------------------------------------------------------------------------------------------------

    Hi,
    Welcome to the forum!
    See this thread [Avoiding Mutating Tables|http://asktom.oracle.com/tkyte/Mutate/index.html]
    Tip: to preserve formatted code enclose it between {noformat}{noformat} tags (start and end tags are the same) :)
    Thank you for posting DDL and DML of basic data, all people that post should follow this approach.
    Regards,                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               

  • ORA-04091: table ACCESSLOG is mutating, trigger/function may not see it

    Hi
    Got the following error
    ORA-04091: table ACCESSLOG is mutating, trigger/function may not see it
    i searched the error found that the problem is with FOR EACH ROW
    how can i handel this specifically with the following code:
    CREATE OR REPLACE TRIGGER EMP_ACCESS
    AFTER INSERT
    ON ACCESSLOG
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
    DECLARE
    tmpVar NUMBER;
    BEGIN
    IF ( :NEW.INOUT = 'OUT' ) THEN
    SELECT 'X'
    INTO tmpVar
    FROM ACCESSLOG
    WHERE EMPLOYEEID = :NEW.EMPLOYEEID
    AND LOGDATE = :NEW.LOGDATE
    AND INOUT ='IN' ;
    IF tmpVar IS NULL THEN
    INSERT INTO Emp_All_Moves_Absent (
    EMP_NO,
    ATT_DATE,
    ATT_FLAG,
    ATT_TIME_IN,
    ATT_TIME_OUT,
    VAC_COD,
    MIS_CODE,
    DAY_FLAG ,
    POSTEDFLAG,
    ATT_TIME_IN_PLANNED,ATT_TIME_OUT_PLANNED)
    VALUES
    (to_number(to_char(:NEW.employeeid,99999)),
    TO_DATE(:NEW.LOGDATE,'DD/MM/YYYY'),
    'ABS' ,
    to_date(:NEW.LOGTIME,'HH24:MI:SS'),
    to_date(:NEW.LOGTIME,'HH24:MI:SS'),
    NULL,
    NULL,
    'WORK',
    0,
    NULL,NULL);
    END IF;
    ELSIF ( :NEW.INOUT = 'IN' ) THEN
    SELECT 'X'
    INTO tmpVar
    FROM ACCESSLOG
    WHERE EMPLOYEEID = :NEW.EMPLOYEEID
    AND LOGDATE = :NEW.LOGDATE-1
    AND INOUT ='IN' ;
    IF tmpVar IS NULL THEN
    INSERT INTO Emp_All_Moves_Absent (
    EMP_NO,
    ATT_DATE,
    ATT_FLAG,
    ATT_TIME_IN,
    ATT_TIME_OUT,
    VAC_COD,
    MIS_CODE,
    DAY_FLAG ,
    POSTEDFLAG,
    ATT_TIME_IN_PLANNED,ATT_TIME_OUT_PLANNED)
    VALUES
    (to_number(to_char(:NEW.employeeid,99999)),
    TO_DATE(:NEW.LOGDATE-1,'DD/MM/YYYY'),
    'ABS' ,
    to_date(:NEW.LOGTIME,'HH24:MI:SS'),
    to_date(:NEW.LOGTIME,'HH24:MI:SS'),
    NULL,
    NULL,
    'WORK',
    0,
    NULL,NULL);
    END IF;
    END IF;
    EXCEPTION
    WHEN OTHERS THEN
    -- Consider logging the error and then re-raise
    RAISE;
    END EMP_ACCESS_LOG_OUT;
    Urgent help is highly appreciated..
    Regards,
    Abdetu..

    Thanks Jens Petersen for reply
    now i want to make sure of one thing that i have to follow the steps but the last one i will replace it with my trigger NO?
    SQL> create or replace package state_pkg
    2 as
    3 type ridArray is table of rowid index by binary_integer;
    4
    4 newRows ridArray;
    5 empty ridArray;
    6 end;
    7 /
    Package created.
    SQL> create or replace trigger parent_bi
    2 before insert or update on parent
    3 begin
    4 state_pkg.newRows := state_pkg.empty;
    5 end;
    6 /
    Trigger created.
    SQL> create or replace trigger parent_aifer
    2 after insert or update of status on parent for each row
    3 begin
    4 state_pkg.newRows( state_pkg.newRows.count+1 ) := :new.rowid;
    5 end;
    6 /
    Trigger created.
    ---------------------now come my trigger instead of the following one ??---------------
    SQL> create or replace trigger parent_ai
    2 after insert or update of status on parent
    3 begin
    4 for i in 1 .. state_pkg.newRows.count loop
    5 insert into log_table
    6 select theKey, status, effDate
    7 from parent where rowid = state_pkg.newRows(i);
    8 end loop;
    9 end;
    10 /
    Trigger created.
    Regards,
    Abdetu..

  • ORA-04091: table name is mutating, trigger/function may not see it

    Hi,
    I have a row level before update trigger written on a table A which calls a procedure to undergo some processing. Procedure has some select queries against table A and it inturn causes the following error.
    ORA-04091: table name is mutating, trigger/function may not see it
    To overcome this I have used a combination of PL/SQL collection types (nested tables based on the following definition TYPE t_table_a is table of A.colname%TYPE index by binary_integer;), a row level before update trigger and statement level after update trigger. The mutating problem is fixed, but to update one row of data it took around 3 min and I am wondering if its the problem with PL/SQL tables I have used.
    In before update trigger I am storing the unique id's which needs to be updated into the PL/SQL table and in the after update trigger I am looping through the PL/SQL table and peforming the rest of the processing by calling in the procedure.
    Can anyone help how to minimize the run time of this process or if any other better solution exists?
    Thanks for the help

    Triggers raise the mutating table issue, because else they could be used to create endless loops. If you work around the mutating table issue, then you should make sure not to create an endless loop yourself. This would be possible.
    You description also seems to imply something like this.
    Without code it is impossible to say something specific.
    - Do you initialize your collection in a before statement trigger?
    - Is your looping mechanism somehow broken?
    - Do you update the same table again and again and again?

Maybe you are looking for

  • ITunes will not open... i get an error message

    Hi. I am having problems opening the iTunes music store. I have Windows XP. When i click on the desktop iTunes icon, i get this error message. "iTunes has encountered a problem and needs to close. We are sorry for the inconvenience." When actually, i

  • [SOLVED] Problem with UNIX permissions

    Hello everyone. It seems I don't have the permission to write in a folder but I don't understand why : olivier:~$ ls -l /srv/ total 8 dr-xr-xr-x 2 root ftp 4096 Feb 14 10:16 ftp drwxrwxr-x 2 http http 4096 Feb 22 16:53 http olivier:~$ cat /etc/group

  • Deployment of simple jsp application in Oracle 10g AS

    Hi All, This is a critical issue. We have a JSP application which uses the plain old java objects to esltabilsh database connection and same old java objects to perform the business logic. All java file are packed in a jar file and all jsp's and othe

  • Billing, output, invoice consolidation

    Hello friends, I am looking for a document on Billing and output .invoice consolidation.....I cant understand from Standard SAP materiel....so if u have made some document for your reference please share it with me... Please E-mail me the matereriel

  • Why can't I install itunes to my computer?

    why can't I install itunes to my computer?