Table is Mutating Error

I created an AFTER INSERT trigger on a table
What this trigger should do is, when there is an insert in the table A, it should pick the value inserted and get other details from another table B and then update the same table A with the values gotten from table B.
I got an error which says that
Table is mutating ...........
Isn't it possible to do an update on the same table

Isn't it possible to do an update on the same table No it isn't. There are complicated reasons why this is the case, but the underlying principle is that doing DML in triggers on the same table is likely to lead to unpredictable results and the database doesn't like unpredictability.
Mutating table is usually a reflection of a poor database design - most likely, as in your case, insufficient normalisation or explicit denormalisation. If you give us an idea of what you are trying to achieve we may be able to suggest a different way of doing the same thing.
Cheers, APC

Similar Messages

  • Way to avoid table is mutating error?

    Hi guys,
    I have a database trigger that fire's after update of a table and throws out an email if 'column 1' is not null, so im trying to set the value of 'column 1' using a button within apex. The value of this column then i want to add to an email, this is were the error occurs, the trigger and the package that reads the column value fires at the same time.. so it's trying to read and update the column at the same time... Is there any way around this other than using a column of a different table??
    T.I.A

    Hi,
    To put it simply, is your problem "l_product_code is not getting a value"?
    Cannot see why you have this cursor with an INTO
    CURSOR c_get_product_code(p_ci_id IN capa_incident. ci_id%TYPE)
    IS
       SELECT ci_flex2
           INTO l_product_code
          FROM capa_incident
        WHERE ci_id = p_ci_id;and then again
    OPEN c_get_product_code(
       p_ci_id);
    FETCH c_get_product_code
       INTO l_product_code;
    CLOSE c_get_product_code;All you need for all this is the code below in place o all the open..fetch..close. I am I missing something?
       SELECT ci_flex2
           INTO l_product_code
          FROM capa_incident
        WHERE ci_id = p_ci_id;Regards,

  • Master/Details tables with CASCADE delete giving "table mutating" error

    Hi,
    I have two tables in a master/details configuration (table 1 is "master", table 2 is "details").
    The details has a FK contraint relation to the master with a CASCADE delete (so when the master is deleted, all associated details are deleted).
    The master table has a column "last_updated_datetime" which is updated by a master table update trigger whenever most (excluding the last_updated_datetime column) columns are updated.
    The details table has an update trigger which also updates the master table's last_updated_datetime column (whenever a detail row is changed).
    The details table also has a delete trigger which also updated the master table's last_updated_datetime column (whenever a detail row is deleted).
    The problem I have is: When the master record is deleted, which cascade deletes the details record(s), the delete trigger on the details table throws a "table is mutating" error.
    I understand that the "mutating" error is "correct" because the master record is being deleted.
    But is there some way I can get around this problem (for example, having the details table delete trigger not update the master table last_updated_datetime) when it's this cascade delete?
    Thanks for your help!

    create table master (
      id number primary key,
      changed date not null
    create table detail (
      id number primary key,
      master_id references master (id) on delete cascade
    create or replace package pkg is
      master_deleted boolean := false;
    end;
    create or replace trigger bds_master
      before delete on master
    begin
      pkg.master_deleted := true;
    end;
    create or replace trigger ads_master
      after delete on master
    begin
      pkg.master_deleted := false;
    end;
    create or replace trigger adr_detail
      after delete on detail
      for each row
    begin
    if not pkg.master_deleted then
        update master
           set changed = sysdate
         where id = :old.master_id;
      end if;
    end;
    insert into master values (1, sysdate - 10);
    insert into detail values (11, 1);
    insert into detail values (12, 1);
    insert into master values (2, sysdate - 10);
    insert into detail values (21, 2);
    insert into detail values (22, 2);
    insert into master values (3, sysdate - 10);
    insert into detail values (31, 3);
    insert into detail values (32, 3);
    commit;
    select * from master order by id;
            ID CHANGED                                                             
             1 01.09.08                                                            
             2 01.09.08                                                            
             3 01.09.08                                                            
    select * from detail order by id;
            ID  MASTER_ID                                                          
            11          1                                                          
            12          1                                                          
            21          2                                                          
            22          2                                                          
            31          3                                                          
            32          3                                                          
    delete detail where id = 21;
    select * from master order by id;
            ID CHANGED                                                             
             1 01.09.08                                                            
             2 11.09.08
             3 01.09.08                                                            
    select * from detail order by id;
            ID  MASTER_ID                                                          
            11          1                                                          
            12          1                                                          
            22          2                                                          
            31          3                                                          
            32          3                                                          
    delete master where id in (1, 2);
    select * from master order by id;
            ID CHANGED                                                             
             3 01.09.08                                                            
    select * from detail order by id;
            ID  MASTER_ID                                                          
            31          3                                                          
            32          3                                                           Regards,
    Zlatko
    Edited by: Zlatko Sirotic on Sep 11, 2008 11:15 PM
    This is disaster - ten attempts to format code!

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

    Hello All,
    I am not an expert in oracle and I have been facing a problem where I get a message as follows :
    ORA-04091: table <table> is mutating, trigger/function may not see it
    I have a table tab1 which has ID, name, and some other columns. the rows in this table form a parent-child type relationship based on some columns within that table. I have created another table called relationship table. The relationship table has 2 columns ID and parentID. I keep this table up to date using triggers. For example if a new record is inserted or upadted in tab1 which affects the parent - child relationship, i update the relationship table accordingly using an insert / update trigger and it works fine.
    I created another trigger as follows
    create or replace trigger MY_DELETE_TRIGGER
    after delete on tab1
    for each row
    BEGIN
    update relationships a set a.parentID = null where a.parentID = :OLD.ID;
    delete from relationships a where a.id = :OLD.ID;
    END MY_DELETE_TRIGGER;
    Basically what I am doing is, the record once deleted, if it was parent of anybody else, i am setting the parent as null and the record itself, if it was in the relationships as a child, I am removing that row.
    This is when I get the table is mutating error, and I don't know how to fix it.
    Can anybody please help me,
    Thanks in advance

    Could you provide more details?
    SQL> select * from tab1;
            ID NAME
             1 test1
             2 test2
    SQL> select * from relationships;
            ID   PARENTID
             1          1
             2          1
    SQL> create or replace trigger MY_DELETE_TRIGGER
      2  after delete on tab1
      3  for each row
      4  BEGIN
      5  update relationships a set a.parentID = null where a.parentID = :OLD.ID;
      6  delete from relationships a where a.id = :OLD.ID;
      7  END MY_DELETE_TRIGGER;
      8  /
    Trigger created.
    SQL> delete from tab1
      2  where id = 1;
    1 row deleted.
    SQL> select * from relationships;
            ID   PARENTID
             2
    SQL> rollback;
    Rollback complete.
    SQL> insert into relationships values(1,1);
    1 row created.
    SQL> select * from relationships;
            ID   PARENTID
             1          1
             2          1
             1          1
    SQL> delete from tab1
      2  where id = 1;
    1 row deleted.
    SQL> select * from relationships;
            ID   PARENTID
             2
    SQL> disconnect
    Disconnected from Oracle9i Enterprise Edition Release 9.2.0.3.0 - 64bit Production
    With the Partitioning option
    JServer Release 9.2.0.3.0 - Production

  • Table is mutating, trigger/function may not see it

    Hi,
    I have been trying to get a trigger to execute a stored procedure when an update is made to a row in a table.
    The procedure works when ran manually and the trigger compiles but when the trigger is fired I get a "table is mutating, trigger/function may not see it" error.
    Here's a bit more background:
    I have a product table where the cost of a product is calculate based on costs in other tables (e.g. cost of raw materials is in the suppliesrawmat table).
    I have written a procedure (called proc_costcalc) which takes in a productID and updates that product's cost in the product table.
    I want a trigger to do this for every affected product when a rawmaterial cost is changed.
    The code of my trigger is:
    CREATE OR REPLACE trigger trig_rawcostupdate
    AFTER INSERT OR UPDATE ON suppliesrawmat FOR EACH ROW
    DECLARE
         cursor c1 is
         SELECT p.prodid
         FROM process p,
              (SELECT s.processid
              FROM stage s,
                   (SELECT stageno
                   FROM stagerawmat
                   WHERE prodid = :new.prodid) subquery0
              WHERE s.stageno = subquery0.stageno) subquery1
         WHERE p.processid = subquery1.processid;
    BEGIN
         FOR tuple in c1
         LOOP
              proc_costcalc(tuple.prodid);
         END LOOP;
    END;
    The query for the cursor generates a list of productIDs which I need to run through the proc_costcalc procedure.
    Can anyone show me where I am going wrong? How can I fix this?
    Thanks
    Keith

    I'm afraid I'm still not getting this.
    Suppose I have 4 tables (product, madefrom, rawmat and suppliesrawmat).
    Product (productid, cost)
    Madefrom (productid, rawmatid)
    Rawmat (rawmatid)
    Suppliesrawmat (supplierid, rawmatid, cost)
    The cost of a product should be the sum cost of all rawmaterials it is made from where the cheapest supply cost of that material is used.
    What I want to do is update the cost of a product when the cost of a raw material used in its production changes.
    My earlier attempt was to have a procedure which when given a productid updates the price of that product. However, when trying to call this procedure from an update on the suppliesrawmat table I recieved the table is mutating error. I now understand why (thanks to everyone for that) but I still don't really know how to rectify the problem.
    How should I be doing this?
    Thanks again
    Keith

  • How to avoid mutating error when insert or update record

    Hi ,
    I have one transaction table which is having some detail record under one transaction number, after the one transaction number is over by insert or update, i
    want to check the total amounts of one flag should be matched on same table if it is not then give error message. But i am getting mutating error on insert or update event trigger on statement level trigger on above table.
    Is there any other way to avoid mutating error to solve the above problem or some temp table concepts to be used. help me its urgent.
    Thanks in advance,
    Sachin Khaladkar
    Pune

    Sachin, here's as short of an example as I could come up with on the fly. The sample data is ficticious and for example only.
    Let's say I need to keep a table of items by category and my business rule states that the items in the table within each category must total to 100% at all times. So I want to insert rows and then make sure any category added sums to 100% or I will rollback the transation. I can't sum the rows in a row-level trigger because I'd have to query the table and it is mutating (in the middle of being changed by a transaction). Even if I could query it while it is mutating, there may be multiple rows in a category with not all yet inserted, so checking the sum after each row is not useful.
    So here I will create;
    1. the item table
    2. a package to hold my record collection (associative array) for the trigger code (the category is used as a key to the array; if I insert 3 rows for a given category, I only need to sum that category once, right?
    3. a before statement trigger to initialize the record collection (since package variables hang around for the entire database session, I need to clear the array before the start of every DML (INSERT in this case) statement against the item table)
    4. a before row trigger to collect categories being inserted
    5. an after statement trigger to validate my business rule
    I then insert some sample data so you can see how it works. Let me know if you have any questions about this.
    SQL> CREATE TABLE item_t
      2   (category  NUMBER(2)   NOT NULL
      3   ,item_code VARCHAR2(2) NOT NULL
      4   ,pct       NUMBER(3,2) NOT NULL);
    Table created.
    SQL>
    SQL> CREATE OR REPLACE PACKAGE trg_pkg IS
      2    TYPE t_item_typ IS TABLE OF item_t.category%TYPE
      3      INDEX BY PLS_INTEGER;
      4    t_item       t_item_typ;
      5    t_empty_item t_item_typ;
      6  END trg_pkg;
      7  /
    Package created.
    SQL> SHOW ERRORS;
    No errors.
    SQL>
    SQL> CREATE OR REPLACE TRIGGER item_bs_trg
      2    BEFORE INSERT
      3    ON item_t
      4  BEGIN
      5    DBMS_OUTPUT.put_line('Initializing...');
      6    trg_pkg.t_item := trg_pkg.t_empty_item;
      7  END item_bs_trg;
      8  /
    Trigger created.
    SQL> SHOW ERRORS;
    No errors.
    SQL>
    SQL> CREATE OR REPLACE TRIGGER item_br_trg
      2    BEFORE INSERT
      3    ON item_t
      4    FOR EACH ROW
      5  BEGIN
      6    trg_pkg.t_item(:NEW.category) := :NEW.category;
      7    DBMS_OUTPUT.put_line('Inserted Item for Category: '||:NEW.category);
      8  END item_br_trg;
      9  /
    Trigger created.
    SQL> SHOW ERRORS;
    No errors.
    SQL>
    SQL> CREATE OR REPLACE TRIGGER item_as_trg
      2    AFTER INSERT
      3    ON item_t
      4  DECLARE
      5    CURSOR c_item (cp_category item_t.category%TYPE) IS
      6      SELECT SUM(pct) pct
      7        FROM item_t
      8       WHERE category = cp_category;
      9  BEGIN
    10    DBMS_OUTPUT.put_line('Verifying...');
    11    FOR i IN trg_pkg.t_item.FIRST..trg_pkg.t_item.LAST LOOP
    12      DBMS_OUTPUT.put_line('Checking Category: '||trg_pkg.t_item(i));
    13      FOR rec IN c_item(trg_pkg.t_item(i)) LOOP
    14        IF rec.pct != 1 THEN
    15          RAISE_APPLICATION_ERROR(-20001,'Category '||trg_pkg.t_item(i)||' total = '||rec.pct);
    16        END IF;
    17      END LOOP;
    18    END LOOP;
    19  END item_as_trg;
    20  /
    Trigger created.
    SQL> SHOW ERRORS;
    No errors.
    SQL> INSERT INTO item_t
      2    SELECT 1, 'AA', .3 FROM DUAL
      3    UNION ALL
      4    SELECT 2, 'AB', .6 FROM DUAL
      5    UNION ALL
      6    SELECT 1, 'AC', .2 FROM DUAL
      7    UNION ALL
      8    SELECT 3, 'AA',  1 FROM DUAL
      9    UNION ALL
    10    SELECT 1, 'AA', .5 FROM DUAL
    11    UNION ALL
    12    SELECT 2, 'AB', .4 FROM DUAL;
    Initializing...
    Inserted Item for Category: 1
    Inserted Item for Category: 2
    Inserted Item for Category: 1
    Inserted Item for Category: 3
    Inserted Item for Category: 1
    Inserted Item for Category: 2
    Verifying...
    Checking Category: 1
    Checking Category: 2
    Checking Category: 3
    6 rows created.
    SQL>
    SQL> SELECT * FROM item_t ORDER BY category, item_code, pct;
      CATEGORY IT        PCT
             1 AA         .3
             1 AA         .5
             1 AC         .2
             2 AB         .4
             2 AB         .6
             3 AA          1
    6 rows selected.
    SQL>
    SQL> INSERT INTO item_t
      2    SELECT 4, 'AB', .5 FROM DUAL
      3    UNION ALL
      4    SELECT 5, 'AC', .2 FROM DUAL
      5    UNION ALL
      6    SELECT 5, 'AA', .5 FROM DUAL
      7    UNION ALL
      8    SELECT 4, 'AB', .5 FROM DUAL
      9    UNION ALL
    10    SELECT 4, 'AC', .4 FROM DUAL;
    Initializing...
    Inserted Item for Category: 4
    Inserted Item for Category: 5
    Inserted Item for Category: 5
    Inserted Item for Category: 4
    Inserted Item for Category: 4
    Verifying...
    Checking Category: 4
    INSERT INTO item_t
    ERROR at line 1:
    ORA-20001: Category 4 total = 1.4
    ORA-06512: at "PNOSKO.ITEM_AS_TRG", line 12
    ORA-04088: error during execution of trigger 'PNOSKO.ITEM_AS_TRG'
    SQL>
    SQL> SELECT * FROM item_t ORDER BY category, item_code, pct;
      CATEGORY IT        PCT
             1 AA         .3
             1 AA         .5
             1 AC         .2
             2 AB         .4
             2 AB         .6
             3 AA          1
    6 rows selected.
    SQL>

  • Mutation error

    Hi,
    I have form in which we are creating parent child relation .The table structure is as follows
    problems(table name)(prom_number,prom_relation,prom_impact,prom_relation,...)(column name).
    I dont have the forms fmb file ,So whenwe create the relation 2 update statement gets executed first in problem table the prom_number which is parent in its problem_relation column its assigned as parent and the problem which is chilld in its column value assigne dare (prom_relation,prom_prom_number)(child,and the value or pro_number which is parent).
    Now our requirement is that the value of prom_impact of child should be assigned to problem which is parent,So i have written a trigger which update the prom_impact column whcih gives mutation error.SO how can we solve this issue.

    The trigger i have written is given below.
    The problem is that from form level the table is updated twice and in the trigger i try to update the row which is parent fault .howere its show mutation error.I even created trigger which shall commit the when from problem_rlation is cahnged to parent .so that in my trigger wheh i update the column prom_imapct field in trigger there should be no reeor.Still it given mutation error.
    CREATE OR REPLACE TRIGGER parent_child_impact_trg
    AFTER UPDATE /*OF prom_relation,prom_prom_number*/ ON PROBLEMS
    REFERENCING NEW AS NEW
    FOR EACH ROW
    Version History:9.2.8.1
    (format: version, date, developer, description)
    1.0, 19-Dec-2008, Tanmoy Kr Moulik The "Impact" of Paren fault ticket
    will be changed upon manual creation of Parent Child relation
    Rules:
    1.0     Upon manual creation of new Parent-Child fault relation, the 'Fault Impact' of
    Child fault will be auto updated in the parent fault, if the parent fault impact matches
    with the attached list(Non Serve Affeect or Threat) or the impact of Parent Fault is blank (null).
    2.0     In case, the parent fault have fault impact matches with the attached list
    (service affect), then its impact is not changed while making the relationship.
    DECLARE
    PRAGMA autonomous_transaction;
    ecode NUMBER;
    emesg VARCHAR2(200);
    --BEGIN
    -- NULL;
    CURSOR c1--(v_prom_num NUMBER)
    IS
    SELECT PROM_IMPACT,prom_number FROM PROBLEMS WHERE prom_number=:NEW.prom_prom_number;
    v_prom_imp VARCHAR2(30) DEFAULT NULL;
    v_prom_imp_p1 NUMBER DEFAULT 0;
    v_prom_imp_p2 NUMBER DEFAULT 0;
    v_prom_num NUMBER;
    BEGIN
    IF :NEW.PROM_RELATION='CHILD' AND :NEW.PROM_PROM_NUMBER IS NOT NULL THEN
    --dbms_output.put_line(1);
    --INSERT INTO TEMP_PROM VALUES(:NEW.prom_number,:NEW.prom_prom_number,:NEW.prom_impact,:NEW.prom_relation);
    --COMMIT;
    OPEN c1;--(:NEW.prom_prom_number);
    FETCH c1 INTO v_prom_imp,v_prom_num;
    --INSERT INTO TEMP_PROM(PROM_NUM,PROM_IMPACT) VALUES(v_prom_num,v_prom_imp);
    --COMMIT;
    IF c1%NOTFOUND THEN
    v_prom_imp:=NULL;
    v_prom_num:=NULL;
    END IF;
    CLOSE c1;
    v_prom_imp:=UPPER(v_prom_imp);
    v_prom_imp_p1:=INSTR(v_prom_imp,'NON');
    v_prom_imp_p2:=INSTR(v_prom_imp,'THREAT');
    --INSERT INTO TEMP_PROM(PROM_NUM) VALUES(v_prom_imp_p1);
    --INSERT INTO TEMP_PROM(PROM_NUM) VALUES(v_prom_imp_p2);
    --COMMIT;
    IF v_prom_imp_p1>0 /*OR v_prom_imp_p2>0*/ THEN
    IF :NEW.prom_impact IS NOT NULL THEN
    BEGIN
    INSERT INTO TEMP_PROM(PROM_NUM,PROM_PROM_NUMBER,prom_impact,PROM_RELATION) VALUES(:NEW.prom_number,:NEW.prom_prom_number,:NEW.prom_impact,:NEW.prom_relation);
    COMMIT;
    EXCEPTION WHEN OTHERS THEN
    INSERT INTO TEMP_PROM(prom_impact,PROM_RELATION) VALUES('failed1'||ecode,emesg);
    END;
    BEGIN
    COMMIT;
    UPDATE PROBLEMS SET PROM_IMPACT=:NEW.PROM_IMPACT WHERE prom_number=:NEW.prom_prom_number;
    COMMIT;
    EXCEPTION WHEN OTHERS THEN
         ecode := SQLCODE;
    emesg := SQLERRM;
    -- BEGIN
    INSERT INTO TEMP_PROM(prom_impact,PROM_RELATION) VALUES('failed'||ecode,emesg);
    COMMIT;
    -- EXCEPTION WHEN OTHERS THEN*/
         NULL;
         --END;
    END;     
    END IF;     
         /*BEGIN
         INSERT INTO TEMP_PROM(PROM_NUM,PROM_IMPACT) VALUES(:NEW.prom_prom_number,:NEW.prom_impact);
         COMMIT;
    EXCEPTION WHEN OTHERS THEN
         INSERT INTO TEMP_PROM(prom_impact) VALUES('failed1');
         NULL;
         END;
    --NULL;
    -- END;
    --COMMIT;
    --END;
    /* BEGIN
    INSERT INTO TEMP_PROM(PROM_NUM,PROM_IMPACT) VALUES(:NEW.prom_prom_number,:NEW.prom_impact);
    EXCEPTION WHEN OTHERS THEN
    --INSERT INTO TEMP_PROM(prom_impact) VALUES('failed');
    NULL;
    END;
    COMMIT;
    --COMMIT;
    /* ELSIF v_prom_imp_p2>0 THEN
    -- v_prom_imp_p2
    IF :NEW.prom_impact IS NOT NULL THEN
    BEGIN
    UPDATE PROBLEMS SET PROM_IMPACT=:NEW.PROM_IMPACT WHERE prom_number=:NEW.prom_prom_number;
    EXCEPTION WHEN OTHERS THEN
    BEGIN
         ecode := SQLCODE;
    emesg := SQLERRM;
    --BEGIN
    INSERT INTO TEMP_PROM(prom_impact,PROM_RELATION) VALUES('failed'||ecode,emesg);
    COMMIT;
    --EXCEPTION WHEN OTHERS THEN
         NULL;
         END;
    NULL;
    END;
    COMMIT;
    BEGIN
    INSERT INTO TEMP_PROM(PROM_NUM,PROM_IMPACT) VALUES(:NEW.prom_prom_number,:NEW.prom_impact);
    EXCEPTION WHEN OTHERS THEN
    NULL;
    END;
    COMMIT;*/
    --UPDATE PROBLEMS SET PROM_IMPACT=:NEW.PROM_IMPACT WHERE prom_number=:NEW.prom_prom_number;
    -- COMMIT;
    -- END IF;
    END IF;
    END IF;
    EXCEPTION WHEN OTHERS THEN
    INSERT INTO TEMP_PROM(prom_impact,PROM_RELATION) VALUES('failed2'||ecode,emesg);
    COMMIT;
    NULL;
    END;

  • 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

    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
    . . .

  • How to handle the mutating error

    create or replace trigger trg_t1
    after insert on t1
    begin
    insert into t1 values(1);
    end;
    i got some error..

    1011927 wrote:
    same table with the same trigger
    Within  trigger code do not issue SQL against same table upon which trigger is based; then no mutating error is thrown

  • URGENT : Trigger with Mutating Error

    Hi,
    I'm trying to write a trigger on a Table ROOM_BLOCK to update a value in table ROOM_OOI_OOS.
    As given below, which works perfectly.
    BEGIN
    IF INSERTING THEN
    IF NVL(:NEW.ROOM_OOI_OOS_ID,0) <> 0 THEN
    UPDATE ROOM_OOI_OOS SET NO_OF_ROOMS = NVL(NO_OF_ROOMS,0)+1
    WHERE ROOM_OOI_OOS_ID = :NEW.ROOM_OOI_OOS_ID;
    END IF;
    ELSIF UPDATING THEN
    IF NVL(:OLD.ROOM_OOI_OOS_ID,0) <> 0 THEN
    UPDATE ROOM_OOI_OOS SET NO_OF_ROOMS = NVL(NO_OF_ROOMS,0)-1
    WHERE ROOM_OOI_OOS_ID = :OLD.ROOM_OOI_OOS_ID;
    END IF;
    IF NVL(:NEW.ROOM_OOI_OOS_ID,0) <> 0 THEN
    UPDATE ROOM_OOI_OOS SET NO_OF_ROOMS = NVL(NO_OF_ROOMS,0)+1
    WHERE ROOM_OOI_OOS_ID = :NEW.ROOM_OOI_OOS_ID;
    END IF;
    ELSE
    IF NVL(:OLD.ROOM_OOI_OOS_ID,0) <> 0 THEN
    UPDATE ROOM_OOI_OOS SET NO_OF_ROOMS = NVL(NO_OF_ROOMS,0)-1
    WHERE ROOM_OOI_OOS_ID = :OLD.ROOM_OOI_OOS_ID;
    END IF;
    END IF;
    END;
    But when I add a select statement. the trigger seems to fail with a mutating error ORA-04091
    and Error at Line which executes the statement immidiate ORA-04088.
    DECLARE
    stmt VARCHAR2(500);
    vcount INTEGER;
    BEGIN
    IF INSERTING THEN
    --INSERT INTO SHRUTI_TEST (DESCR) VALUES ('Inserting');
    IF NVL(:NEW.ROOM_OOI_OOS_ID,0) <> 0 THEN
    stmt := 'Select count(*) from ROOM_BLOCK ' ||
    ' WHERE ROOM_OOI_OOS_ID = ' || :NEW.ROOM_OOI_OOS_ID ||
    ' AND ROOM_NO = ''' || :NEW.ROOM_NO || ''' ';
    EXECUTE IMMEDIATE stmt INTO vcount;
    IF vcount = 1 THEN
    UPDATE ROOM_OOI_OOS SET NO_OF_ROOMS = NVL(NO_OF_ROOMS,0)+1
    WHERE ROOM_OOI_OOS_ID = :NEW.ROOM_OOI_OOS_ID;
    END IF;
    END IF;
    ELSIF UPDATING THEN
    IF NVL(:OLD.ROOM_OOI_OOS_ID,0) <> 0 THEN
    UPDATE ROOM_OOI_OOS SET NO_OF_ROOMS = NVL(NO_OF_ROOMS,0)-1
    WHERE ROOM_OOI_OOS_ID = :OLD.ROOM_OOI_OOS_ID;
    END IF;
    IF NVL(:NEW.ROOM_OOI_OOS_ID,0) <> 0 THEN
    UPDATE ROOM_OOI_OOS SET NO_OF_ROOMS = NVL(NO_OF_ROOMS,0)+1
    WHERE ROOM_OOI_OOS_ID = :NEW.ROOM_OOI_OOS_ID;
    END IF;
    ELSE
    IF NVL(:OLD.ROOM_OOI_OOS_ID,0) <> 0 THEN
    UPDATE ROOM_OOI_OOS SET NO_OF_ROOMS = NVL(NO_OF_ROOMS,0)-1
    WHERE ROOM_OOI_OOS_ID = :OLD.ROOM_OOI_OOS_ID;
    END IF;
    END IF;
    END;
    Please tell me how to solve this problem...
    Regards
    Mike.

    Thank you for your reply to my posting.
    I researched and used your recommendation. I was
    wondering if you can help me resolve the following two
    problems.
    Table kassa1 has NAME and AGE columns. Table Kassa2
    has one column Age.
    I have created the following trigger. It keeps
    raising a ORA-06519 : Active autonomous transaction
    detected and rolled back error.
    Create or replace trigger Name_Age_Row after insert or
    update on Kassa1
    For each row
    Declare
    Total_Age VARCHAR(8);
    PRAGMA AUTONOMOUS_TRANSACTION;
    BEGIN
         Select SUM(Age) into Total_Age from Kassa1;
         insert into kassa2 values(Total_aAge);
    End;     
    The following trigger also generates ORA-00036:
    Maximum number of recursive SQL levels(50) exceeded
    error.
    Create or replace trigger Name_Age_Row after insert or
    update on Kassa1
    For each row
    Declare
    PRAGMA AUTONOMOUS_TRANSACTION;
    BEGIN
         insert into kassa1 values('newname', 'newage');
    End;     

  • A SMALL EXAMPLE CODE FOR MUTATING ERROR

    create or replace trigger TRG_T1
    before insert on T1
    begin
    insert into T1 values(2);
    end;
    IF I TRY TO INSERT INTO T1 TABLE I GET A MUTATING ERROR HOW CAN I SOLVE??????

    joealexander wrote:
    create or replace trigger TRG_T1
    before insert on T1
    begin
    insert into T1 values(2);
    end;
    IF I TRY TO INSERT INTO T1 TABLE I GET A MUTATING ERROR HOW CAN I SOLVE??????
    No, you do NOT get a mutating table error. You get this:
    orcl112> create table t1(c1 number);
    Table created.
    Elapsed: 00:00:00.03
    orcl112> create or replace trigger TRG_T1
      2
      3  before insert on T1
      4
      5  begin
      6
      7  insert into T1 values(2);
      8
      9  end;
    10
    11  /
    Trigger created.
    Elapsed: 00:00:00.04
    orcl112> insert into t1 values (1);
    insert into t1 values (1)
    ERROR at line 1:
    ORA-00036: maximum number of recursive SQL levels (50) exceeded
    ORA-06512: at "SCOTT.TRG_T1", line 3
    ORA-04088: error during execution of trigger 'SCOTT.TRG_T1'
    ORA-06512: at "SCOTT.TRG_T1", line 3
    ORA-04088: error during execution of trigger 'SCOTT.TRG_T1'
    ORA-06512: at "SCOTT.TRG_T1", line 3
    ORA-04088: error during execution of trigger 'SCOTT.TRG_T1'
    ORA-06512: at "SCOTT.TRG_T1", line 3
    ORA-04088: error during execution of trigger 'SCOTT.TRG_T1'
    ORA-06512: at "SCOTT.TRG_T1", line 3
    ORA-04088: error during execution of trigger 'SCOTT.TRG_T1'
    You are the second person today who has claimed to have seen this error and posted code that did not raise it. What is going on?

  • How to over come mutating error

    Can Anyone explain me how to OVERCOME Mutating error when firing a trigger ?
    Thanks in advance.

    1. Don't use triggers
    2. Don't perform DML on the same table your trigger is based on.
    Without information (such as your table create statement and your trigger code) there's not a lot else we can say right now.
    If you're getting a mutating table error, it's an indication that either your logic or your design (or both!) need rethinking...

  • Mutating error solution

    hi group
    prem here
    i am stillnot able to get the solution for mutating error.
    let me give u scenario
    before insert trigger -----on emp and in the trigger i select using the :new values , i get the mutating error,fine so far so good.
    when it comes to solution i am unable tomake out from the link which was given in one of the replies,
    can anyone pls in a simple words try to give a solution for:::::
    scenario before i insert into emp a record i need to check if there is no record present in the table
    solution ----
    after going thru few sites i could zero in to a simple solution
    1.creat a package variable store the :new variable
    2.create a procedure or function to test if record exists and pass yesy or no to the trigger and then take the decision
    also under what other cases do we get mutating errors
    pls look into this problem and give me a solution
    i hope it wll be of gr8 help to thers also
    regards
    prem

    http://asktom.oracle.com/pls/ask/f?p=4950:8:14402737568889680009::NO::F4950_P8_DISPLAYID,F4950_P8_CRITERIA:469621337269
    Rgds.

  • Mutating error in different situations....

    Hi All
    I am getting mutating error in the following situtations.......please provide the suitable solution
    1) Update same table on which trigger has been written
    e.g. written trigger on abc table in which
    command
    update abc set col_nm=’New Name’
    where col_id=
    2) In trigger block called some procedure.
    In procedure again update same table.
    e.g. written trigger on abc table
    it calls proc1 procedure.
    In proc1 procedure it again update abc table
    3)Select same table in same trigger e.g.
    Written trigger on abc table and in that again query for selecting data.
    Select sum(col_1) from abc
    4)In trigger block called some procedure.
    In procedure again select same table.
    e.g. written trigger on abc table
    it calls proc1 procedure.
    In proc1 procedure it again select sum(col_1) from abc
    5) In trigger block called some procedure in procedure update
    another table which has a trigger in this trigger there is update or select query
    for same table
    e.g written trigger on abc table it calls procedure proc1 in proc1 it is updating some other table
    xyz which has a update trigger in this update trigger it has updating and selecting data from
    table abc.

    http://asktom.oracle.com/tkyte/Mutate/index.html

Maybe you are looking for