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
Similar Messages
-
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 -
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? -
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 HouriI 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 -
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,
PaulHello
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 -
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, -
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,
MathewYes, 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,
QiangIn get_point_coordinates(point_id, layerid), it does not have any codes deleting thing from point_tab.
Its functionality is to find out that specified point;
put its coordinates into SDO_GEOMETRY object and return as function value.
However, oracle does not allow me to delete any data from point table since then.It is saying that function (get_point_coordinates) can not know mutating tables.
When I run delete task:
delete from point$_view where point_id = 1;
I got errors:
ERROR at line 1:
ORA-04091: table POINT$_TABLE is mutating, trigger/functio
n may not see it
ORA-06512: at "GET_POINT_COORDINATES", /* THIS LINE REPORS ERROR*/ Look at codes below.
The following is code of function: GET_POINT_COORDINATES
FUNCTION GET_POINT_COORDINATES(pPoint_ID IN NUMBER, player_ID IN NUMBER)
RETURN MDSYS.SDO_GEOMETRY DETERMINISTIC IS
PSRID NUMBER :=NULL:
PLON NUMBER := NULL;
PLAT NUMBER := NULL;
CURSOR get_lonlat(ppoint_id IN NUMBER, player_id IN NUMBER) IS SELECT LON,LAT
FROM POINT$_VIEW /* THIS LINE REPORS ERROR*/
WHERE player_id = layer_id AND ppoint_id = point_id;
BEGIN
PSRID := 8265;
OPEN get_lonlat(pPoint_ID,Player_ID);
FETCH get_lonlat INTO PLON, PLAT;
RETURN MDSYS.SDO_GEOMETRY(2001,PSRID,MDSYS.SDO_POINT_TYPE(PLON,PLAT,NULL),NULL ,NULL);
END GET_POINT_GEOM;
I guess it has nothing with foreign key. There is something wrong with this function.
By the way, a spatail index is built on this function. Does this make any differences on this point? -
ORA-04091: table AM is mutating, trigger/function may not see it
I create this trigger:
CREATE OR REPLACE TRIGGER pr_test
after insert ON AM
FOR EACH ROW
declare
appo_pr varchar2(64):= null;
BEGIN
select name
into appo_pr
from AS
where AS_ID=:new.AS_ID;
insert into AM (name) values (appo_pr);
END pr_test;
I insert before a new AS_ID and name in tab AS but when I insert a new record in tab AM I get this error:
ORA-04091: table AM is mutating, trigger/function may not see it
ORA-06512: at PR_TEST", line 11
ORA-04088: error during execution of trigger PR_TEST'
I'd like to create a trigger that when I insert a new record in AM It verify the value in col name of AS and insert this value in col name of AM.
What I wrong in this trigger??
How can I modify it??
Thanks
RafTry this:
CREATE OR REPLACE TRIGGER pr_test
before insert ON AM
FOR EACH ROW
declare
appo_pr AS.name%TYPE;
BEGIN
select name
into appo_pr
from AS
where AS_ID = :new.AS_ID;
:new.name = appo_pr;
END pr_test; -
ORA-04091:table XYZ is mutating,trigger/function may not see it ORA-06512
Hi everybody
i am facing mutating problem during data deletion fron XYZ table as
ORA-04091:table XYZ is mutating,trigger/function may not see it ORA-06512 at "user.procdure_name",line 39 ORA-065
i have table XYZ and have database trigger on this table
and also have procedure "user.abc" in this procedure m selecting data from xyz tableYou didn't post the actual code. I was more interested in seeing table name and the trigger body.
Anyways, mutation problem comes when you refer the same table on the trigger, on which it is based for some data manipulation on that table.
For e.g, If inside your trigger body, you are doing INSERT on the same table, then it'll definitely result in mutation problem because this trigger will be fired endlessly (as it is after insert trigger).
Please mark answer as helpful / correct, if it helps you
Navnit -
ORA-04091: table ACCESSLOG is mutating, trigger/function may not see it
Hi
Got the following error
ORA-04091: table ACCESSLOG is mutating, trigger/function may not see it
i searched the error found that the problem is with FOR EACH ROW
how can i handel this specifically with the following code:
CREATE OR REPLACE TRIGGER EMP_ACCESS
AFTER INSERT
ON ACCESSLOG
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
tmpVar NUMBER;
BEGIN
IF ( :NEW.INOUT = 'OUT' ) THEN
SELECT 'X'
INTO tmpVar
FROM ACCESSLOG
WHERE EMPLOYEEID = :NEW.EMPLOYEEID
AND LOGDATE = :NEW.LOGDATE
AND INOUT ='IN' ;
IF tmpVar IS NULL THEN
INSERT INTO Emp_All_Moves_Absent (
EMP_NO,
ATT_DATE,
ATT_FLAG,
ATT_TIME_IN,
ATT_TIME_OUT,
VAC_COD,
MIS_CODE,
DAY_FLAG ,
POSTEDFLAG,
ATT_TIME_IN_PLANNED,ATT_TIME_OUT_PLANNED)
VALUES
(to_number(to_char(:NEW.employeeid,99999)),
TO_DATE(:NEW.LOGDATE,'DD/MM/YYYY'),
'ABS' ,
to_date(:NEW.LOGTIME,'HH24:MI:SS'),
to_date(:NEW.LOGTIME,'HH24:MI:SS'),
NULL,
NULL,
'WORK',
0,
NULL,NULL);
END IF;
ELSIF ( :NEW.INOUT = 'IN' ) THEN
SELECT 'X'
INTO tmpVar
FROM ACCESSLOG
WHERE EMPLOYEEID = :NEW.EMPLOYEEID
AND LOGDATE = :NEW.LOGDATE-1
AND INOUT ='IN' ;
IF tmpVar IS NULL THEN
INSERT INTO Emp_All_Moves_Absent (
EMP_NO,
ATT_DATE,
ATT_FLAG,
ATT_TIME_IN,
ATT_TIME_OUT,
VAC_COD,
MIS_CODE,
DAY_FLAG ,
POSTEDFLAG,
ATT_TIME_IN_PLANNED,ATT_TIME_OUT_PLANNED)
VALUES
(to_number(to_char(:NEW.employeeid,99999)),
TO_DATE(:NEW.LOGDATE-1,'DD/MM/YYYY'),
'ABS' ,
to_date(:NEW.LOGTIME,'HH24:MI:SS'),
to_date(:NEW.LOGTIME,'HH24:MI:SS'),
NULL,
NULL,
'WORK',
0,
NULL,NULL);
END IF;
END IF;
EXCEPTION
WHEN OTHERS THEN
-- Consider logging the error and then re-raise
RAISE;
END EMP_ACCESS_LOG_OUT;
Urgent help is highly appreciated..
Regards,
Abdetu..Thanks Jens Petersen for reply
now i want to make sure of one thing that i have to follow the steps but the last one i will replace it with my trigger NO?
SQL> create or replace package state_pkg
2 as
3 type ridArray is table of rowid index by binary_integer;
4
4 newRows ridArray;
5 empty ridArray;
6 end;
7 /
Package created.
SQL> create or replace trigger parent_bi
2 before insert or update on parent
3 begin
4 state_pkg.newRows := state_pkg.empty;
5 end;
6 /
Trigger created.
SQL> create or replace trigger parent_aifer
2 after insert or update of status on parent for each row
3 begin
4 state_pkg.newRows( state_pkg.newRows.count+1 ) := :new.rowid;
5 end;
6 /
Trigger created.
---------------------now come my trigger instead of the following one ??---------------
SQL> create or replace trigger parent_ai
2 after insert or update of status on parent
3 begin
4 for i in 1 .. state_pkg.newRows.count loop
5 insert into log_table
6 select theKey, status, effDate
7 from parent where rowid = state_pkg.newRows(i);
8 end loop;
9 end;
10 /
Trigger created.
Regards,
Abdetu.. -
ORA-04091: table name is mutating, trigger/function may not see it
Hi,
I have a row level before update trigger written on a table A which calls a procedure to undergo some processing. Procedure has some select queries against table A and it inturn causes the following error.
ORA-04091: table name is mutating, trigger/function may not see it
To overcome this I have used a combination of PL/SQL collection types (nested tables based on the following definition TYPE t_table_a is table of A.colname%TYPE index by binary_integer;), a row level before update trigger and statement level after update trigger. The mutating problem is fixed, but to update one row of data it took around 3 min and I am wondering if its the problem with PL/SQL tables I have used.
In before update trigger I am storing the unique id's which needs to be updated into the PL/SQL table and in the after update trigger I am looping through the PL/SQL table and peforming the rest of the processing by calling in the procedure.
Can anyone help how to minimize the run time of this process or if any other better solution exists?
Thanks for the helpTriggers raise the mutating table issue, because else they could be used to create endless loops. If you work around the mutating table issue, then you should make sure not to create an endless loop yourself. This would be possible.
You description also seems to imply something like this.
Without code it is impossible to say something specific.
- Do you initialize your collection in a before statement trigger?
- Is your looping mechanism somehow broken?
- Do you update the same table again and again and again? -
ORA-04091: table blah is mutating, trigger/function may not see it
ORA-04091: table blah is mutating, trigger/function may not see it
ORA-06512: at "AOLALERE.CHK_FOR_POST", line 7
ORA-06512: at "AOLALERE.CHK_FOR_POST", line 20
ORA-06512: at "AOLALERE.PREPRODDTA_F41021_AFTER_UPDATE", line 14
ORA-04088: error during execution of trigger 'AOLALERE.PREPRODDTA_F41021_AFTER_UPDATE'
TRIGGER preproddta_f41021_after_update
after insert or update
on preproddta.f41021
for each row
declare
--nothing to declare
--pragma autonomous_transaction;
l_lipqoh preproddta.f41021.lipqoh%type;
l_lipcom preproddta.f41021.lipcom%type;
l_lihcom preproddta.f41021.lihcom%type;
l_lilots preproddta.f41021.lilots%type;
l_lilocn preproddta.f41021.lilots%type;
l_lilotn preproddta.f41021.lilots%type;
l_quantity_avail f41021_audit.quantity_avail%type;
l_rec_chk f41021_audit.liitm%type;
begin
--chk_for_post(:new.limcu,:new.liitm);
--if :old.limcu <> ' GBD001' then return; end if;
if :old.lipqoh = :new.lipqoh then
l_lipqoh := :old.lipqoh;
else
l_lipqoh := :new.lipqoh;
end if;
if :old.lipcom = :new.lipcom then
l_lipcom := :old.lipcom;
else
l_lipcom := :new.lipcom;
end if;
if :old.lihcom = :new.lihcom then
l_lihcom := :old.lihcom;
else
l_lihcom := :new.lihcom;
end if;
if :old.lilots = :new.lilots then
l_lilots := :old.lilots;
else
l_lilots := :new.lilots;
end if;
if l_lilots <> ' ' then
l_quantity_avail := - (l_lipcom - l_lihcom);
else
l_quantity_avail := l_lipqoh - (l_lipcom + l_lihcom);
end if;
l_rec_chk := rec_chk(:old.limcu,:old.liitm,l_lilots);
if l_rec_chk is not null then
begin
update f41021_audit
set lipqoh = l_lipqoh,
lipcom = l_lipcom,
lihcom = l_lihcom,
quantity_avail = l_quantity_avail
where limcu = :old.limcu
and liitm = :old.liitm
and lilotn = :old.lilotn
and lilocn = :old.lilocn
and lilots = l_lilots;
end;
else
-- insert record into audit table
begin
insert into f41021_audit
(limcu,
liitm,
lipqoh,
lipcom,
lihcom,
lilots,
lilotn,
lilocn,
quantity_avail)
values
(:old.limcu,
:old.liitm,
l_lipqoh,
l_lipcom,
l_lihcom,
l_lilots,
:old.lilotn,
:old.lilocn,
l_quantity_avail);
end;
end if;
end;
create or replace procedure chk_for_post(p_limcu in varchar2,
p_liitm in number)
is
cursor get_bra_qa(p_limcu in varchar2,
p_liitm in number)is
select liitm,
(sum(lipqoh) - sum(lipcom + lihcom)) qual_avail
from preproddta.f41021 a, preproddta.f4101 b
where limcu = p_limcu
and liitm = imitm
and liitm = p_liitm
group by liitm,imdsc1;
l_bra_qa get_bra_qa%rowtype;
l_itm_bran_qa t_f41021_itm_bran_qa := t_f41021_itm_bran_qa.initialize(p_liitm);
begin
open get_bra_qa(p_limcu,p_liitm);
fetch get_bra_qa into l_bra_qa;
close get_bra_qa;
if l_itm_bran_qa.quantity_avail is null then ---This indicate that there is no record for
---quantity available for the item based on the branch .
l_itm_bran_qa := new t_f41021_itm_bran_qa(p_liitm);
begin
l_itm_bran_qa.liitm := p_liitm;
l_itm_bran_qa.limcu := p_limcu;
l_itm_bran_qa.quantity_avail := l_bra_qa.qual_avail;
l_itm_bran_qa.add_it;
commit;
end;
else
l_itm_bran_qa := t_f41021_itm_bran_qa.initialize(p_liitm);
if l_itm_bran_qa.quantity_avail = l_bra_qa.qual_avail then
null; return;
else
begin
l_itm_bran_qa.liitm := p_liitm;
l_itm_bran_qa.limcu := p_limcu;
l_itm_bran_qa.quantity_avail := l_bra_qa.qual_avail;
l_itm_bran_qa.send_to_DB;
commit;
end;
end if;
end if;
end;Thanks,
I comment it out cos it was causing the problem this is the code:
The following error has occurred:
ORA-04091: table PREPRODDTA.F41021 is mutating, trigger/function may not see it
ORA-06512: at "AOLALERE.CHK_FOR_POST", line 7
ORA-06512: at "AOLALERE.CHK_FOR_POST", line 20
ORA-06512: at "AOLALERE.PREPRODDTA_F41021_AFTER_UPDATE", line 98
ORA-04088: error during execution of trigger 'AOLALERE.PREPRODDTA_F41021_AFTER_UPDATE'
TRIGGER preproddta_f41021_after_update
after insert or update
on preproddta.f41021
for each row
declare
--nothing to declare
--pragma autonomous_transaction;
l_lipqoh preproddta.f41021.lipqoh%type;
l_lipcom preproddta.f41021.lipcom%type;
l_lihcom preproddta.f41021.lihcom%type;
l_lilots preproddta.f41021.lilots%type;
l_lilocn preproddta.f41021.lilots%type;
l_lilotn preproddta.f41021.lilots%type;
l_quantity_avail f41021_audit.quantity_avail%type;
l_rec_chk f41021_audit.liitm%type;
begin
--if :old.limcu <> ' GBD001' then return; end if;
if :old.lipqoh = :new.lipqoh then
l_lipqoh := :old.lipqoh;
else
l_lipqoh := :new.lipqoh;
end if;
if :old.lipcom = :new.lipcom then
l_lipcom := :old.lipcom;
else
l_lipcom := :new.lipcom;
end if;
if :old.lihcom = :new.lihcom then
l_lihcom := :old.lihcom;
else
l_lihcom := :new.lihcom;
end if;
if :old.lilots = :new.lilots then
l_lilots := :old.lilots;
else
l_lilots := :new.lilots;
end if;
if l_lilots <> ' ' then
l_quantity_avail := - (l_lipcom - l_lihcom);
else
l_quantity_avail := l_lipqoh - (l_lipcom + l_lihcom);
end if;
l_rec_chk := rec_chk(:old.limcu,:old.liitm,l_lilots);
if l_rec_chk is not null then
begin
update f41021_audit
set lipqoh = l_lipqoh,
lipcom = l_lipcom,
lihcom = l_lihcom,
quantity_avail = l_quantity_avail
where limcu = :old.limcu
and liitm = :old.liitm
and lilotn = :old.lilotn
and lilocn = :old.lilocn
and lilots = l_lilots;
end;
else
-- insert record into audit table
begin
insert into f41021_audit
(limcu,
liitm,
lipqoh,
lipcom,
lihcom,
lilots,
lilotn,
lilocn,
quantity_avail)
values
(:old.limcu,
:old.liitm,
l_lipqoh,
l_lipcom,
l_lihcom,
l_lilots,
:old.lilotn,
:old.lilocn,
l_quantity_avail);
end;
end if;
chk_for_post(:new.limcu,:new.liitm);
return;
end;
create or replace procedure chk_for_post(p_limcu in varchar2,
p_liitm in number)
is
cursor get_bra_qa(p_limcu in varchar2,
p_liitm in number)is
select liitm,
(sum(lipqoh) - sum(lipcom + lihcom)) qual_avail
from preproddta.f41021 a, preproddta.f4101 b
where limcu = p_limcu
and liitm = imitm
and liitm = p_liitm
group by liitm,imdsc1;
l_bra_qa get_bra_qa%rowtype;
l_itm_bran_qa t_f41021_itm_bran_qa := t_f41021_itm_bran_qa.initialize(p_liitm);
begin
open get_bra_qa(p_limcu,p_liitm);
fetch get_bra_qa into l_bra_qa;
close get_bra_qa;
if l_itm_bran_qa.quantity_avail is null then ---This indicate that there is no record for
---quantity available for the item based on the branch .
l_itm_bran_qa := new t_f41021_itm_bran_qa(p_liitm);
begin
l_itm_bran_qa.liitm := p_liitm;
l_itm_bran_qa.limcu := p_limcu;
l_itm_bran_qa.quantity_avail := l_bra_qa.qual_avail;
l_itm_bran_qa.add_it;
commit;
end;
else
l_itm_bran_qa := t_f41021_itm_bran_qa.initialize(p_liitm);
if l_itm_bran_qa.quantity_avail = l_bra_qa.qual_avail then
null; return;
else
begin
l_itm_bran_qa.liitm := p_liitm;
l_itm_bran_qa.limcu := p_limcu;
l_itm_bran_qa.quantity_avail := l_bra_qa.qual_avail;
l_itm_bran_qa.send_to_DB;
commit;
end;
end if;
end if;
end;
Please sugesst any work around. I need to call calculate changes based on the insert or updates
Maybe you are looking for
-
How do I use a counter to measure frequency and multiple analog signals in the same VI?
I have a PCI-6071E, an SC-2345 with multiple modules, and a PXI-8184 (with a PXI-1002 Chassis). My goal is to monitor pressures, flows, temperatures, and speed in one VI. I am using Measurement and Automation Explorer version 3.1.1.3004 to manage my
-
Does anyone know how to add custom "Report Links" to OBIEE? Right now the standard report links available are "Modify", "Refresh", "Printer Friendly", "Download", "Addd to Briefing Book", and "Copy". I want add another option called "Detailed Report"
-
Hi, Please let me know,how to set release strategy for rfq.. i'VE ACTIVATED MY RELEASE STRATEGY FOR po USING TABLE cekko... iF I WANT TO ACTIVATE RELEASE STRATEGY FOR rfq... WHICH TABLE AND FIELD NAME I WANT TO USE... PLS EXPLAIN..
-
How to keep data integrity with the two business service in OSB 10.3.1.0
How to keep data integrity with the two business service in OSB 10.3.1.0 In our customer system, customer want to keep data integerity between two businness service. I thinks this is XA transaction issue. Basing customer requirment, I created a testc
-
Is it possible to make a joltpool ?
Hi Weblogic is started without successful jolt session pool cause of not being booted JSL in remote site. after a few minutes, JSL process is booted. in case of this, without shutdown the weblogic, is it possible to make the jolt session pool for JSL