MUTATING TABLES(ORA-04091) ERROR

HI ALL,
i am trying to solve the above problem. I don't have much experience in pl/sql. I tell u the problem.
I am trying to write trigger on transaction_master table before insert or update so that record can insert into tran_modify_log table. Because of the referential integrity i got the error ORA-04091. I COPIED THE FOLLOWING CODE. BUT ITS FOR ONLY ONE COLUMN.OTHER COLUMNS ARE HARD CODED. U can see this in 2nd trigger IN_TRANS_MOD_LOG. can any body help me to insert all the column values from transaction_master table to tran_modify_log table. If is there any easy way please let me know.
with regards,
vali
CREATE OR REPLACE PACKAGE INSERT_TRANSACTION_MODIFY_LOG IS
-- DEFINE A PL/SQL TABLE TYPE TO STORE THE ORDER_ID INFO
TYPE INSERT_TRAN_MOD_LOG_TABLE IS TABLE OF TRANSACTION_MASTER.TRANSACTION_ID%TYPE
INDEX BY BINARY_INTEGER;
-- DECLARE VARIABLES FOR THE PL/SQL TABLE AND COUNTER
INSERT_TRAN_MOD_LOG_TABLE_REC INSERT_TRAN_MOD_LOG_TABLE;
INS_T_M_L_TAB_INDEX_NUM PLS_INTEGER:=0;
END INSERT_TRANSACTION_MODIFY_LOG;
CREATE OR REPLACE TRIGGER INS_TRANS_MOD_LOG BEFORE INSERT OR UPDATE ON TRANSACTION_MASTER FOR EACH ROW
BEGIN
--INCREMENT PL/SQL TABLE INDEX BEFORE INSERTING
INSERT_TRANSACTION_MODIFY_LOG.INS_T_M_L_TAB_INDEX_NUM:=INSERT_TRANSACTION_MODIFY_LOG.INS_T_M_L_TAB_INDEX_NUM+1;
--ADD THE TRANSACTION_ID TO THE PL/SQL TABLE
INSERT_TRANSACTION_MODIFY_LOG.INSERT_TRAN_MOD_LOG_TABLE_REC(INSERT_TRANSACTION_MODIFY_LOG.INS_T_M_L_TAB_INDEX_NUM):
=NVL(:OLD.TRANSACTION_ID,:NEW.TRANSACTION_ID);
END INS_TRANS_MOD_LOG;
CREATE OR REPLACE TRIGGER IN_TRANS_MOD_LOG BEFORE INSERT OR UPDATE ON TRANSACTION_MASTER
BEGIN
-- LOOP THROUGH THE PL/SQL, PERFORMING PROCESSING FOR EACH TRANSACTION
FOR LV_TAB_INDEX_NUM IN 1..INSERT_TRANSACTION_MODIFY_LOG.INS_T_M_L_TAB_INDEX_NUM LOOP
-- INSERT INITIAL TRANSACTION RECORD FOR EVERY TRANSACTION
INSERT INTO TRAN_MODIFY_LOG(MODIFY_DATE,MODIFY_TIME,TRANSACTION_ID,USER_ID)
VALUES('13/06/2002','13:30',INSERT_TRANSACTION_MODIFY_LOG.INSERT_TRAN_MOD_LOG_TABLE_REC(LV_TAB_INDEX_NUM),'MIKE');
END LOOP;
-- INITIALIZE PACKAGE VARIABLE COUNTER FOR SUBSEQUENT INSERTS
INSERT_TRANSACTION_MODIFY_LOG.INS_T_M_L_TAB_INDEX_NUM:=0;
END IN_TRANS_MOD_LOG;
/

sorry, my mistake, point 7-8 became:
7) But if u now login with the sys dba account:
connect sys/dbapass@database
then drop student.trg_a and student.trg_b and then recreate both under the sys schema:
CREATE OR REPLACE TRIGGER SYS.TRG_A
AFTER INSERT OR DELETE ON STUDENT.P
FOR EACH ROW
begin
if deleting then
update STUDENT.Q set cnt=cnt-1 where id=2;
else
update STUDENT.Q set cnt=cnt+1 where id=2;
end if;
end;
/--- cut point for trigger creation
CREATE OR REPLACE TRIGGER SYS.TRG_B
AFTER INSERT OR UPDATE ON STUDENT.Q
FOR EACH ROW
declare
p number;
maxr number;
begin
select sum(CNT) into p from STUDENT.Q where id=:new.id;
select sum(MAX) into maxr from STUDENT.R where id=:new.id;
dbms_output.put_line('P:'||p||', maxr:'||maxr);
if (p<=maxr) then
dbms_output.put_line('p<=maxr is true');
else
dbms_output.put_line('p<=maxr is false');
end if;
end;
8) reconnect with ur working user account:
example: connect student/password@database
9) when re-doing inserts as point 6), the trigger sys.trg_b will fire without raising any ora-04091 error!!!!
The trigger behave like if the mutating table limitation is not existing at all!!!
does anyone know anything about this behavior?
thank u very much
sincerely

Similar Messages

  • Mutating table ora-04091

    Hello, I have question regarding error ora-04091. I have two tables, table1 has a PK column "ID" and table2 has column "ID" from table1 as the FK. Each time I try to update column "ID" in table 1, I get the following error.
    ORA-04091: table test1 is mutating, trigger/function may not see it.
    I will really appreciate this answer. Please include any scripts I should use to correct this.
    null

    let us say you have trigger like this
    create or replace trigger test
    After update on table1
    for each row
    begin
    do some processing
    end;
    this means its a row level trigger and fires for every row updated.
    now you can change this to,
    create or replace trigger test
    after update on table1
    begin
    **** do some processing
    end;
    the above is a statement level trigger that is, it is fired only once after the update statment even if 20 rows maybe affected by update.
    now you can change the keyword after update
    to before update and make the trigger fire before it updates the row. depending your business constraint this solution may or maynot work.
    hope this helps, for more info abt mutating triggers go to oracle documentation (link is available on the left) and look into the oracle 8i application developers guide-fundamentals. this has lot of examples...
    null

  • Avoiding Mutating table (ORA-04091)

    Hi Folks,
    I encounter the following error while I'm trying to update a table which fires an after update trigger.
    What steps should I take to avoid this error.
    ORA-04091: table test is mutating, trigger/function may not see it
    table test (id number, status varchar2(10), dt date);
    I just want my trigger to update date in test table once it's fired.
    create or replace trigger AU_TEST
    after update on test
    for each row
    BEGIN
    UPDATE TEST
    SET DT= :new.DT;
    END IF;
    END;
    How can I go around this mutating error?
    Thanks in advance.

    Hi,
    I have a situation where on queue will update a table SAMPLE. In the demo table i have two columns SAMPLE_VOLUME and SAMPLE_TYPE. When it updates one row, if the SAMPLE_VOLUME is greater than 0, i have to insert 1 in the corresponding SAMPLE_TYPE column. How can i achive this? I wrote a trigger like this. but it give the above mutating error.
    CREATE or REPLACE TRIGGER TRIGGER_SAMPLE_UPDATE
    AFTER INSERT OR UPDATE ON SAMPLE
    FOR EACH ROW
    DECLARE
         SAMPLE_VOLUME NUMBER;
    BEGIN
         IF(SAMPLE_VOLUME > 0) THEN
              INSERT INTO SAMPLE(SAMPLE_TYPE) VALUES(1);
         ELSE
              INSERT INTO SAMPLE(SAMPLE_TYPE) VALUES(2);
         END IF;
    END;
    Could you help me in this?

  • Drop Table :ORA-00604: error occurred at recursive SQL level 1

    Hi,
    When I am trying to drop a table, getting the following error:
    SQL> drop table drp_test;
    drop table drp_test
    ERROR at line 1:
    ORA-00604: error occurred at recursive SQL level 1
    ORA-01422: exact fetch returns more than requested number of rows
    This is applicable even when I am trying to drop a table as sys user. I am not able to drop any table within this database. Previously I was able to carry this operation successfully.
    Database Version: 10.2.0.1.0
    OS: Linux
    Thanks in advance for your valuable time.
    Regards,
    Joy

    Hi Anurag,
    I was unable to access net and hence is the delay in reply. Kindly suggest me regarding the level of trace to be generated.
    Regards,
    Joy

  • Update from table ORA-00933 error

    I use Oracle 10g. The following throws an ORA-00933 SQL command not properly ended Error
    update fb_mst_complaint
    set sub_category = n.subcategory
    from fb_mst_complaint s,
    select a.docket_no, a.sub_category, c.subcategory
    from fb_mst_complaint a,
    +( select category, min(subcategory) subcategory+
    from fb_subcategory
    where activated > 0
    group by category
    +) c+
    where a.category =
    +( select distinct a.category from fb_subcategory b+
    where b.category = a.category
    and b.subcategory = c.subcategory
    and b.activated > 0
    +)+
    and a.category = c.category
    and a.sub_category <= 0
    ) n
    where s.docket_no = n.docket_no
    and s.sub_category = n.sub_category
    and s.docket_no = 8573;
    The error is shown in the FROM clause. However, The SELECT statement which makes up the alias name 'n' works accurately.
    Please help. Thanks for the help in advance.
    Edited by: user11195221 on May 24, 2009 6:35 AM

    user11195221 wrote:
    The issue is that the inner select returns multiple values and therefore cannot be set as mentioned.Well then you cannot do this in a single UPDATE statement (you could use the rownum = 1 construct but it would make no sense without knowing the business context).

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

  • Mutating table

    Hello,
    I have a table with srce_id,c_code and l_c_code. when ever data is uploaded into w_ty_e_ap table c_code value has to be copied to l_c_code based on srce_id.Input file has blank data for l_c_code.When I have written the below trigger I am getting:
    ORA-04091: table w_ty_e_ap is mutating, trigger/function may not see it
    Can you please advise me,
    Cheers,
    PSK
    CREATE OR REPLACE TRIGGER SA_TR_CO_CE_SM
    after INSERT
    ON w_ty_e_ap
    FOR EACH row
    DECLARE
    vno NUMBER;
    CURSOR c1
    IS
    SELECT c_code
    from w_ty_e_ap
    where srce_id=:new.srce_id
    for update of c_code;
    BEGIN
    open c1;
    loop
    fetch c1 into vno;
    if c1%notfound then
    VNO := 9999;
    else
    UPDATE w_ty_e_ap
    SET l_c_code = vno
    WHERE CURRENT OF c1;
    end if;
    end loop;
    close c1;
    END;
    /

    Hi ,
    I also paste the following proposed by Oracle .......about 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 runtime error occurs, the effects of the trigger body and triggering statement are rolled back, and control is returned to the user or application.
    Consider the following trigger:
    CREATE OR REPLACE TRIGGER Emp_count
    AFTER DELETE ON Emp_tab
    FOR EACH ROW
    DECLARE
        n INTEGER;
    BEGIN
        SELECT COUNT(*) INTO n FROM Emp_tab;
        DBMS_OUTPUT.PUT_LINE(' There are now ' || n ||
            ' employees.');
    END;
    If the following SQL statement is entered:
    DELETE FROM Emp_tab WHERE Empno = 7499;
    An error is returned because the table is mutating when the row is deleted:
    ORA-04091: table SCOTT.Emp_tab is mutating, trigger/function may not see it
    If you delete the line "FOR EACH ROW" from the trigger, it becomes a statement trigger which is not subject to this restriction, and the trigger.
    If you need to update a mutating table, you could bypass these restrictions by using a temporary table, a PL/SQL table, or a package variable. For example, in place of a single AFTER row trigger that updates the original table, resulting in a mutating table error, you might use two triggers—an AFTER row trigger that updates a temporary table, and an AFTER statement trigger that updates the original table with the values from the temporary table.
    Declarative integrity constraints are checked at various times with respect to row triggers.
    Because declarative referential integrity constraints are not supported between tables on different nodes of a distributed database, the mutating table restrictions do not apply to triggers that access remote nodes. These restrictions are also not enforced among tables in the same database that are connected by loop-back database links. A loop-back database link makes a local table appear remote by defining an Oracle Net path back to the database that contains the link.Regards,
    Simon

  • Mutating Table in 10.2.0.4

    After upgrading our environment from 10.2.0.3 to 10.2.0.4, the following trigger has started erroring when trying to insert data into the EMPLOYER_HOLDS table.
    CREATE OR REPLACE TRIGGER EMPHLD_BIR
    BEFORE INSERT
    ON EMPLOYER_HOLDS
    FOR EACH ROW
    BEGIN
    IF :NEW.emphld_no IS NULL
    THEN
    SELECT nvl(max(emphld_no), 0) + 1
    INTO :NEW.emphld_no
    FROM employer_holds
    WHERE prty_id = :NEW.prty_id
    AND empdtl_no = :NEW.empdtl_no;
    END IF;
    END;
    The error received is:
    ORA-04091: table UICONNECT.EMPLOYER_HOLDS is mutating, trigger/function may not see it
    ORA-06512: at "UICONNECT.EMPHLD_BIR", line 4
    ORA-04088: error during execution of trigger 'UICONNECT.EMPHLD_BIR'
    We have identified at least 145 other triggers in our environment that have this same issue.
    TWO QUESTIONS:
    1. Is there a workaround or a suggested solution to resolve this error?
    2. Can anyone confirm a comment I heard from another DBA that states the following: " This error actually occurred in 10.2.0.3 as well but a bug in that version of Oracle caused the error message to NOT be thrown, therefore giving no indication that the error occurred when in fact it may have"....can anyone shed some light on that statement? Is it accurate?
    Thanks in advance.
    Tony G.

    The main point is that you always had the error, even though you weren't able to see it, so you need to apply all the fixes, since your application is essentially not functioning the way you designed it.
    Do you have access to Metalink?
    If so, read up document ID 74859.1
    Oracle proposes a workaround, but only for referential integrity scenarios, which might be applicable to your circumstances
    >
    Scope and Application
    For users requiring the ability to cascade update, delete or insert whilst being able to maintain referential integrity between objects.
    ORA-4091 Mutating Table Explanation and Workarounds
    Overview
    The purpose of this paper is to illustrate to those customers who require one of the following functional capabilities whilst being able to maintain referential integrity among objects:
    * Cascade Update
    * Cascade Delete
    * Cascade Insert
    For cascade Update and Insert functions, using stored triggers and procedures will result in an ORA-04091 - "Table <table_name> is mutating" error.
    ORA-04091: "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.
    ORA-04091 is a very common error that occurs with triggers if triggers are not managed properly. A full understanding of triggers will help you avoid that error.
    A mutating table is a table that is currently being modified by an update, delete, or insert statement. You will encounter the ORA-04091 error if you have a row trigger that reads or modifies the mutating table. For example, if your trigger contains a select statement or an update statement referencing the table it is triggering off of you will receive the error.
    Another way that this error can occur is if the trigger has statements to change the primary, foreign or unique key columns of the table the trigger is triggering from.
    If you must have triggers on tables that have referential constraints, the workaround is to enforce the referential integrity through triggers as well.
    It must be stressed that this solution should ONLY be used to overcome DML restrictions imposed on triggers in order to maintain referential integrity. Whenever possible it is recommended that normal declarative integrity should be used to maintain foreign key integrity. Enforcing this integrity through stored triggers and procedures will have an effect on performance compared with declarative integrity.
    For this solution to work correctly there must be no declarative integrity constraints between objects to enforce the foreign key constraint. The basic principle behind this solution is to suppress the validation checks performed as a result of inserting or updating a foreign key in the CHILD table triggered by a cascade Update or Insert. These checks would normally verify the existence of the new foreign key value in the PARENT record (by SELECTING from the parent table). The suppression of this check is only carried out as a direct result of Cascade Update or Delete, as we can be confident that this new value for the foreign key in the CHILD record does exist (i.e. a result of it being inserted or updated in the PARENT table). In all other circumstances no suppression will take place (e.g. when changing the DEPTNO of an employee or when inserting a new employee).
    The following code illustrates how this is achieved for the cascade Update scenario, the code can easily be modified to add the other functionality and encapsulate it all within the same package. The EMP and DEPT table have been used, with the column EMP.DEPTNO in the EMP table referencing DEPT.DEPTNO in the DEPT table.

  • ORA-04091 mutating table error

    Hi,
    Using Oracle 8.1.7 on Windows 2000.
    I am trying to write a trigger that fires at each insert my Java application executes in my_table, when the trigger is supposed to update, on the just inserted row, the code field.
    I created my trigger to fire AFTER and on INSERT, on each row with the following body:
    DECLARE
    v_max_code my_table.code%TYPE;
    BEGIN
    SELECT MAX(code) INTO v_max_code FROM my_table;
    v_max_code := v_max_code + 1;
    UPDATE my_table SET code = v_max_code;
    END;
    When the insert was attempted I got the "ORA-04091 Table is mutating, trigger/function may not see it
    " error and the transaction was rolled back.
    I modified the triger "on statement" and it worked, bit it updated all the code fields from the table, not only the one from the inserted row, which is not surprising, because I didn't add a where clause for the update statement.
    My questions are:
    - Is it possible to use a "on each row" trigger to achieve the update after insert?
    - How should tell Oracle to update only the code for the just inserted row?
    Thanks in advance,
    Paul

    Hello
    You need a combination of before statement, after row and after statement to get round this:
    http://osi.oracle.com/~tkyte/Mutate/index.html
    Also, is more than one person going to insert into this table at once? If so, you run the risk of 2 people selecting the same max code at the same time and so 2 rows could end up with the same code. Just a suggestion but this looks like it could be better served with a sequence, and you may be able to get rid of the trigger all together.
    HTH
    David

  • SQL, PL/SQL functions, and ORA-04091 table is mutating

    Dears,
    Recently a question came up in an Oracle French forum about an insert/select that is throwing ORA-04091: table xxxx is mutating, trigger/function may not see it error in 11g while the same insert/select was working very well in 10g. The original poster gave a scenario that is easily reproducible. I am wondering what database release is correct the one throwing the error(11g) or the other one accepting the insert/select(10g)?
    *10g*
    mhouri.world > select * from v$version;
    BANNER                                                                         
    Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi               
    PL/SQL Release 10.2.0.4.0 - Production                                         
    CORE     10.2.0.4.0     Production                                                     
    TNS for Solaris: Version 10.2.0.4.0 - Production                               
    NLSRTL Version 10.2.0.4.0 - Production                                         
    mhouri.world > create table t_read_consistency (id number, vc varchar2(15), primary key (id));
    Table created.
    mhouri.world > insert into
      2        t_read_consistency
      3      select
      4        rownum id,
      5        rpad('a',15,'a')
      6      from
      7        dual
      8      connect by
      9        level<=1000;
    1000 rows created.
    mhouri.world > commit;
    Commit complete.
    mhouri.world > create or replace function f_read_consistency return varchar2
      2       as
      3        lv_vc  t_read_consistency.vc%type;
      4       begin
      5         select trc.vc
      6         into lv_vc
      7          from t_read_consistency trc
      8         where trc.id = 70 ;
      9        return lv_vc;
    10     end f_read_consistency;
    11    /
    Function created.
    mhouri.world >insert into
      2        t_read_consistency (id, vc)
      3      select
      4         1001
      5        ,f_read_consistency
      6      from dual;
          ,f_read_consistency
    ERROR at line 5:
    ORA-04091: table MHOURI.T_READ_CONSISTENCY is mutating, trigger/function may not see it
    ORA-06512: at "MHOURI.F_READ_CONSISTENCY", line 5
    _11g_
    mohamed@mhouri> select * from v$version;
    BANNER                                                                         
    Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production         
    PL/SQL Release 11.2.0.1.0 - Production                                         
    CORE     11.2.0.1.0     Production                                                     
    TNS for 32-bit Windows: Version 11.2.0.1.0 - Production                        
    NLSRTL Version 11.2.0.1.0 - Production                                         
    mohamed@mhouri> create table t_read_consistency (id number, vc varchar2(15), primary key (id));
    Table created.
    mohamed@mhouri> insert into
      2    t_read_consistency
      3  select
      4    rownum id,
      5    rpad('a',15,'a')
      6  from
      7    dual
      8  connect by
      9    level<=1000;
    1000 rows created.
    mohamed@mhouri>  create or replace function f_read_consistency return varchar2
      2   as
      3    lv_vc  t_read_consistency.vc%type;
      4   begin
      5     select trc.vc
      6     into lv_vc
      7      from t_read_consistency trc
      8     where trc.id = 70 ;
      9    return lv_vc;
    10  end f_read_consistency;
    11  /
    Function created.
    mohamed@mhouri> insert into
      2    t_read_consistency (id, vc)
      3  select
      4     1001
      5    ,f_read_consistency
      6  from dual;
      ,f_read_consistency
    ERROR at line 5:
    ORA-04091: table MOHAMED.T_READ_CONSISTENCY is mutating, trigger/function may
    not see it
    ORA-06512: at "MOHAMED.F_READ_CONSISTENCY", line 5 So far so good. Same behaviour for both releases. But let's bring a small change to the PL/SQL function to be as close as the example given in the French Forum
    _10g where the select/insert was working without error_:
    mhouri.world > select * from v$version;
    BANNER                                                                         
    Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi               
    PL/SQL Release 10.2.0.4.0 - Production                                         
    CORE     10.2.0.4.0     Production                                                     
    TNS for Solaris: Version 10.2.0.4.0 - Production                               
    NLSRTL Version 10.2.0.4.0 - Production       
    mhouri.world > create type t_read_cs as object (id number,vc varchar2(15));
      2  /
    Type created.
    mhouri.world > create type t_read_cs_tab  as table of t_read_cs;
      2  /
    Type created.
    mhouri.world > create or replace function f_read_consistency_tab
      2  return t_read_cs_tab
      3    as
      4      lc_t_read_cs_tab t_read_cs_tab := t_read_cs_tab();
      5      j  binary_integer := 0;
      6    begin
      7        for x in (select
      8                      id,
      9                      vc
    10                   from  t_read_consistency trs
    11                  where trs.id <= 10
    12       ) loop
    13 
    14          j := j +1;
    15          lc_t_read_cs_tab.extend;
    16          lc_t_read_cs_tab(j) := t_read_cs(x.id, x.vc);
    17     end loop;
    18     RETURN lc_t_read_cs_tab;
    19   end f_read_consistency_tab;
    20  /
    Function created.
    mhouri.world > select count(1) from t_read_consistency;
      COUNT(1)                                                                                                             
          1000                                                                                                             
    mhouri.world > select count(1)
      2  from (select * from table(f_read_consistency_tab));
      COUNT(1)                                                                                                             
            10                                                                                                             
    mhouri.world > insert into t_read_consistency
      2         (id,vc)
      3      select id,vc
      4   from table(f_read_consistency_tab)
      5  ;
    10 rows created.
    mhouri.world > select count(1) from t_read_consistency;
      COUNT(1)                                                                                                             
          1010            
    _11g where the same insert/select is throwing an error:_
    mohamed@mhouri> select * from v$version;
    BANNER
    Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
    PL/SQL Release 11.2.0.1.0 - Production
    CORE    11.2.0.1.0      Production
    TNS for 32-bit Windows: Version 11.2.0.1.0 - Production
    NLSRTL Version 11.2.0.1.0 - Production
    mohamed@mhouri> create type t_read_cs as object (id number,vc varchar2(15));
      2  /
    Type created.
    mohamed@mhouri> create type t_read_cs_tab  as table of t_read_cs;
      2  /
    Type created.
    mohamed@mhouri> create or replace function f_read_consistency_tab
      2      return t_read_cs_tab
      3        as
      4          lc_t_read_cs_tab t_read_cs_tab := t_read_cs_tab();
      5          j  binary_integer := 0;
      6        begin
      7            for x in (select
      8                          id,
      9                          vc
    10                      from  t_read_consistency trs
    11                     where trs.id <= 10
    12          ) loop
    13 
    14            j := j +1;
    15             lc_t_read_cs_tab.extend;
    16             lc_t_read_cs_tab(j) := t_read_cs(x.id, x.vc);
    17        end loop;
    18        RETURN lc_t_read_cs_tab;
    19      end f_read_consistency_tab;
    20    /
    Function created.
    mohamed@mhouri> select count(1) from t_read_consistency;
      COUNT(1)                                                                     
          1000                                                                     
    mohamed@mhouri> select count(1) from (select * from table(f_read_consistency_tab));
      COUNT(1)                                                                     
            10                                                                     
    mohamed@mhouri> insert into t_read_consistency
      2            (id,vc)
      3          select id,vc
      4      from table(f_read_consistency_tab)
      5     ;
        from table(f_read_consistency_tab)
    ERROR at line 4:
    ORA-04091: table MOHAMED.T_READ_CONSISTENCY is mutating, trigger/function may
    not see it
    ORA-06512: at "MOHAMED.F_READ_CONSISTENCY_TAB", line 7 In addition, one of the posters spotted out very judiciously that if we slightly change the definition of the table t_read_consistency in 11g, strangely the insert/select will work correctly in this data base as shown below:
    ohamed@mhouri> drop table tr_read_consistency;
    Table dropped.
    mohamed@mhouri> create table tr_read_consistency
      2      as select rownum rn,
      3                trs.*
      4      from
      5         t_read_consistency trs;
    Table created.
    mohamed@mhouri> insert into tr_read_consistency
      2                 (rn, id,vc)
      3              select rownum, id,vc
      4           from table(f_read_consistency_tab);
    10 rows created.So is this a regression? or a corrected bug during upgrade?
    Thanks in advance
    Mohamed Houri

    I just followed the doc links provided by Tubby, which have 100% Correct answer. See below :
    SQL> select * from v$version;
    BANNER
    Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
    PL/SQL Release 11.2.0.1.0 - Production
    CORE    11.2.0.1.0      Production
    TNS for 32-bit Windows: Version 11.2.0.1.0 - Production
    NLSRTL Version 11.2.0.1.0 - Production
    SQL> show user;
    USER is "SCOTT"
    SQL> create type t_read_cs as object (id number,vc varchar2(15));
      2  /
    Type created.
    SQL> create type t_read_cs_tab  as table of t_read_cs;
      2  /
    Type created.
    SQL> create table t_read_consistency (id number, vc varchar2(15), primary key (id));
    Table created.
    SQL> create or replace function f_read_consistency_tab
      2  return t_read_cs_tab
      3  as
      4  lc_t_read_cs_tab t_read_cs_tab := t_read_cs_tab();
      5  j  binary_integer := 0;
      6  begin
      7  for x in (select
      8  id,
      9  vc
    10  from  t_read_consistency trs
    11  where trs.id <= 10
    12  ) loop
    13  j := j +1;
    14  lc_t_read_cs_tab.extend;
    15  lc_t_read_cs_tab(j) := t_read_cs(x.id, x.vc);
    16  end loop;
    17  RETURN lc_t_read_cs_tab;
    18  end f_read_consistency_tab;
    19  /
    Function created.
    SQL> insert into
      2  t_read_consistency
      3  select
      4  rownum id,
      5  rpad('a',15,'a')
      6  from
      7  dual
      8  connect by
      9  level<=1000;
    1000 rows created.
    SQL> select count(1) from t_read_consistency;
      COUNT(1)
          1000
    SQL> select count(1) from (select * from table(f_read_consistency_tab));
      COUNT(1)
            10
    SQL> insert into t_read_consistency
      2  (id,vc)
      3  select id,vc
      4  from table(f_read_consistency_tab);
    from table(f_read_consistency_tab)
    ERROR at line 4:
    ORA-04091: table SCOTT.T_READ_CONSISTENCY is mutating, trigger/function may not see it
    ORA-06512: at "SCOTT.F_READ_CONSISTENCY_TAB", line 7
    SQL> ed
    Wrote file afiedt.buf
      1  create or replace function f_read_consistency_tab
      2  return t_read_cs_tab
      3  as
      4  lc_t_read_cs_tab t_read_cs_tab := t_read_cs_tab();
      5  j  binary_integer := 0;
      6  PRAGMA AUTONOMOUS_TRANSACTION; <--- This works as documented in 11.2.0.1
      7  begin
      8  for x in (select
      9  id,
    10  vc
    11  from  t_read_consistency trs
    12  where trs.id <= 10
    13  ) loop
    14  j := j +1;
    15  lc_t_read_cs_tab.extend;
    16  lc_t_read_cs_tab(j) := t_read_cs(x.id, x.vc);
    17  end loop;
    18  RETURN lc_t_read_cs_tab;
    19* end f_read_consistency_tab;
    SQL> /
    Function created.
    SQL> insert into t_read_consistency
      2  (id,vc)
      3  select id,vc
      4  from table(f_read_consistency_tab);
    insert into t_read_consistency
    ERROR at line 1:
    ORA-00001: unique constraint (SCOTT.SYS_C0011307) violated
    SQL> drop table t_read_consistency purge;
    Table dropped.
    SQL> create table t_read_consistency (id number, vc varchar2(15));
    Table created.
    SQL> insert into
      2  t_read_consistency
      3  select
      4  rownum id,
      5  rpad('a',15,'a')
      6  from
      7  dual
      8  connect by
      9  level<=1000;
    1000 rows created.
    SQL> commit;
    Commit complete.
    SQL> insert into t_read_consistency
      2  (id,vc)
      3  select id,vc
      4  from table(f_read_consistency_tab);
    10 rows created.
    SQL> commit;
    Commit complete.
    SQL>So, you have to add only PRAGMA AUTONOMOUS_TRANSACTION; before begin in your function code to avoid ORA-04091 in 11.2.0.1
    But, All thanks to Tubby who pointed us to the correct documentation link.
    Regards
    Girish Sharma

  • 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

  • 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  mutating

    Hi,
    I have a trigger which executes a stored procedure.
    Trigger
    =======
    CREATE OR REPLACE TRIGGER mhubadmin.call_proc_ratesheet_new
    after INSERT OR delete ON mhubadmin.pvt_br_ratesheet
    FOR EACH ROW
    declare
    var_orgid number;
    begin
    if inserting then
    select org_child_id into var_orgid from business_relationship where br_id=:new.br_id;
    mhubadmin.proc_ratesheet_new(var_orgid);
    else
    select org_child_id into var_orgid from business_relationship where br_id=:old.br_id;
    mhubadmin.proc_ratesheet_new(var_orgid);
    end if;
    end;
    Stored Procedure
    ==============
    CREATE OR REPLACE PROCEDURE proc_ratesheet_new(var_orgid in number)
    IS
    cursor c3 is select distinct(purs.user_id) from hubuser hu
    inner join PVT_USER_RATESHEET purs on hu.USER_ID=purs.USER_ID
                   where hu.ORG_ID=var_orgid;
    cursor c1(varUser_id number) is select purs.user_id,purs.ratesheet_id from hubuser hu
    inner join PVT_USER_RATESHEET purs on hu.USER_ID=purs.USER_ID
                   where hu.ORG_ID=var_orgid and purs.USER_ID=varUser_id;
    cursor c2(varUser_id number) is select hu.user_id,pbr.ratesheet_id from HUBUSER hu
                             inner join BUSINESS_RELATIONSHIP br on hu.ORG_ID=br.ORG_CHILD_ID
                             inner join PVT_BR_RATESHEET pbr on br.BR_ID=pbr.BR_ID
                                  where hu.user_id in(select distinct(purs.USER_ID) from hubuser hu
                                       inner join PVT_USER_RATESHEET purs
                                                                     on hu.USER_ID=purs.USER_ID
                                                 where hu.ORG_ID=var_orgid) and hu.user_id=varUser_id;
    foundFlag boolean;
    BEGIN
         for c3var in c3 loop
    for c2var in c2(c3var.user_id) loop
              foundFlag:=false;
              for c1var in c1(c3var.user_id) loop
                   if c2var.ratesheet_id=c1var.ratesheet_id then
                        foundFlag:=true;
                             exit;
                        end if;
                   end loop;
                   if foundFlag=False then
                   insert into pvt_user_ratesheet (username_ratesheet_id,user_id,ratesheet_id) values (SEQ_USER_RATESHEET.nextval,c3var.user_id,c2var.ratesheet_id);
                   end if;
              end loop;
    end loop;
         for c3var in c3 loop
              for c1var in c1(c3var.user_id) loop
              foundFlag:=false;
              for c2var in c2(c3var.user_id) loop
                        if c1var.ratesheet_id=c2var.ratesheet_id then
                        foundFlag:=true;
                        exit;
                        end if;
                   end loop;
                   if foundFlag=False then
                   delete from pvt_user_ratesheet where user_id=c3var.user_id and ratesheet_id=c1var.ratesheet_id;
                   end if;
              end loop;
    end loop;
    --EXCEPTION
    --- WHEN OTHERS THEN
    --- DBMS_OUTPUT.put_line (SQLCODE||' '|| SQLERRM);
    END;
    But while firing this trigger I am getting an error like this,
    ORA-04091: table MHUBADMIN.PVT_BR_RATESHEET is mutating, trigger/function may not see it
    ORA-06512: at "MHUBADMIN.PROC_RATESHEET_NEW", line 14
    ORA-06512: at "MHUBADMIN.PROC_RATESHEET_NEW", line 25
    ORA-06512: at "MHUBADMIN.CALL_PROC_RATESHEET_NEW", line 6
    ORA-04088: error during execution of trigger 'MHUBADMIN.CALL_PROC_RATESHEET_NEW'
    Regards,
    Mathew

    Yes, and I'm reading this on a computer screen!
    What functional requirement are you trying to achieve?
    And have you googled? If so, you would have found this
    http://asktom.oracle.com/tkyte/Mutate/index.html
    Cheers,
    Colin

  • ORA-04091: table QA.LIB_ACCESSION_LOG is mutating

    hi
    while executing this:
    SQL> insert into LIB_ACCESSION_LOG select * from LIB_ACCESSION_LOG11;
    insert into LIB_ACCESSION_LOG select * from LIB_ACCESSION_LOG11
    ERROR at line 1:
    ORA-04091: table QA.LIB_ACCESSION_LOG is mutating, trigger/function may not
    see it
    ORA-06512: at "QA.TRG_ACCESSION_LOG", line 2
    ORA-04088: error during execution of trigger 'QA.TRG_ACCESSION_LOG'
    how can i do this insert and resolve this error. should i switch off the constraints? and what will happen when i switch on the constraints?

    ORA-04091, ORA-06512, ORA-04088.

  • 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?

Maybe you are looking for