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
Similar Messages
-
Hi All,
I am getting the “ORA-04091 - mutating table error" when my trigger on a table "fnd_flex_values" fires. As I understand it, this error is occuring because, the users are trying to add rows to this table (it is an after insert trigger) and the trigger is trying to get values from the same table.
Any suggestions on how to get around the mutating table error?
My trigger code :
CREATE OR REPLACE TRIGGER "APPS".ST_BU_PARENT_CC
after insert on APPLSYS.FND_FLEX_VALUES REFERENCING OLD AS OLD NEW AS NEW
for each row
Declare
v_flex_value varchar2(150) :=null;
v_desc varchar2(2) := null;
v_createdby number :=null;
v_lstupdby number :=null;
v_lstupdlogin number :=null;
begin
if inserting then
select a.last_update_login,a.last_updated_by,a.created_by,a.flex_value,
rtrim(substr(description,instr(b.description,',')+1,5))
into v_lstupdlogin,v_lstupdby,v_createdby,v_flex_value,v_desc
from fnd_flex_values a,
fnd_flex_values_tl b
where a.flex_value_id = b.flex_value_id
and a.flex_value_set_id = :new.flex_value_set_id
and a.flex_value_set_id = 1009635
and (a.flex_value like '1%' or a.flex_value like '7%')
order by flex_value asc;
insert into applsys.fnd_flex_value_hierarchies
values(:new.flex_value_set_id,v_desc||'STO',v_flex_value,v_flex_value,sysdate,v_lstupdby,sysdate,v_createdby,null,null,null);
insert into applsys.fnd_flex_value_norm_hierarchy
values(:new.flex_value_set_id,v_desc||'STO','P',v_flex_value,v_flex_value,sysdate,v_lstupdby,sysdate,v_createdby,v_lstupdlogin,null,null);
end if;
exception
when no_data_found then
raise;
end;Thanks,
Chiru>>
Any suggestions on how to get around the mutating
table error?
This link by Tom Kyte should help you with the
"mutating table" error.
http://asktom.oracle.com/tkyte/Mutate/index.html
pratzPratz,
Thanks for the quick reply. I am trying to create a temp table (log_table) but having the "insufficient privilages" issues.
Thanks,
Chiru -
i am trying to updata any row at the time i am getting mutating table error for some triggers
fired on that table.what is the resonn and how to solve this problem,plz..helpHere's a good resource
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:290416059674 -
Hi,
I want a solution for mutating table error. I am a newbie in oracle.
I'll explain my scenario.
There are two tables TEACHER and STUDENT
both are linked using the field 'tid'. the foreign key relation is given as ON DELETE CASCADE
so if i delete a row from teacher , the corresponding rows in student get deleted, but i want to back up all the students who comes under that teacher, who is getting deleted.
I tried in TRIGGER, but getting mutating table error.
Please help
Thanks in advance
DivyaThis extract from an earlier post might be of help:
You can solve this problem by using following thing
1)create a view on same table with all fields
and write trigger on table (insert,update or delete ) while inserting or updating or deleting row from table read from view.
(Mutating error come when you are reading from one table and want to update,insert or delete row of same table).
2)create a temporary table(but it is possible in 8i onword only) same as table on which you want to write trigger,while updating,inserting or deleting rows of table read from temporary table and after your work is over temporary table auotomatically drop (see proper command in oracle documentation to create temporary table).
null -
How to solve mutating table error?
I compiled the trigger below successfully:
CREATE OR REPLACE TRIGGER avail_products
BEFORE INSERT ON orders_tbl
FOR EACH ROW
DECLARE
m_prodqty products_tbl.prod_qty%TYPE;
m_ordered orders_tbl.ord_qty%TYPE;
m_prodid orders_tbl.prod_id%TYPE;
BEGIN
SELECT p.prod_qty, o.ord_qty, o.prod_id
INTO m_prodqty, m_ordered, m_prodid
FROM products_tbl p, orders_tbl o
WHERE ord_num=:NEW.ord_num;
IF m_prodqty>=m_ordered THEN
UPDATE products_tbl
SET prod_qty=prod_qty-m_ordered
WHERE prod_id=m_prodid;
ELSE
RAISE_APPLICATION_ERROR(-20101,'Product is not available');
END IF;
END;
However, when I run my PL/SQL block as follows:
DECLARE
v_max NUMBER;
BEGIN
SELECT MAX(ord_num)+1
INTO v_max
FROM orders_tbl;
INSERT INTO orders_tbl(ord_num, cust_id, prod_id, ord_qty, ord_date, dvy_date, refund)
VALUES (v_max, &cust_id, &prod_id, &ord_qty, '&ord_date', '&dvy_date',0);
COMMIT;
END;
UPDATE orders_tbl
SET refund=0.1*(SELECT price FROM products_tbl WHERE prod_id=(SELECT prod_id FROM orders_tbl WHERE ord_num=(SELECT MAX(ord_num) FROM orders_tbl)))
WHERE ord_num = (SELECT MAX(ord_num) FROM orders_tbl) AND dvy_date>ord_date+3;
COMMIT;
It gives me these errors:
ERROR at line 1:
ORA-01403: no data found
ORA-01403: no data found
ORA-06512: at "SYSTEM.AVAIL_PRODUCTS", line 9
ORA-04088: error during execution of trigger 'SYSTEM.AVAIL_PRODUCTS'
ORA-06512: at line 10
I try to debug it again and again but still can't find the mistake. So I change the trigger option to AFTER INSERT, then I got the error message that the table is mutating and trigger migh not see it. Anyone know how to solve this problem?
ERROR at line 2:
ORA-04091: table SYSTEM.ORDERS_TBL is mutating, trigger/function may not see it
ORA-06512: at "SYSTEM.AVAIL_PRODUCTS", line 13
ORA-04088: error during execution of trigger 'SYSTEM.AVAIL_PRODUCTS'
nullThis extract from an earlier post might be of help:
You can solve this problem by using following thing
1)create a view on same table with all fields
and write trigger on table (insert,update or delete ) while inserting or updating or deleting row from table read from view.
(Mutating error come when you are reading from one table and want to update,insert or delete row of same table).
2)create a temporary table(but it is possible in 8i onword only) same as table on which you want to write trigger,while updating,inserting or deleting rows of table read from temporary table and after your work is over temporary table auotomatically drop (see proper command in oracle documentation to create temporary table).
null -
Mutating table error in Trigger
i was asked to create a trigger like...
1. whenever a row inserted into TFILE, a select statment will be used to bring some data from different tables using a join(including FILE_TABLE)
and then inserting selected values into a new table NEW_TAB.
2. whenever a row Deleted from TFILE table, That curresponding row should be deleted from NEW_TAB.
i Tried Like....
create or replace
TRIGGER my_trigger
AFTER INSERT OR DELETE
ON tfile
FOR EACH ROW
DECLARE
V_FILE_ID NUMBER(8);
V_PROP_ID NUMBER(8);
V_DOC_ID NUMBER(8);
V_TEMP_FILE_ID NUMBER(8);
BEGIN
IF INSERTING THEN
SELECT B.DOC_ID,
B.PROP_ID,
A.FILE_ID
INTO V_DOC_ID,
V_PROP_ID,
V_FILE_ID
FROM (SELECT DOC_ID,
FILE_ID
FROM DOC_FILE
WHERE FILE_ID = (SELECT FILE_ID
FROM TFILE
WHERE FILE_ID = :NEW.FILE_ID)) A ,
DOC_OPPT B
WHERE B.DOC_ID = A.DOC_ID;
INSERT INTO NEW_TAB (SNO,FILE_ID,PROP_ID,DOC_ID)VALUES(CUST_COR_SEQ.NEXTVAL,V_FILE_ID,V_PROP_ID,V_DOC_ID);
END;
ELSIF DELETING THEN
DELETE FROM NEW_TAB WHERE FILE_ID = :OLD.FILE_ID;
END IF;
==================================================================
I am getting error like..
ORA-04091: table STARS.TFILE is mutating, trigger/function may not see it
ORA-06512: at "STARS.MY_TRIGGER", line 8
ORA-04088: error during execution of trigger 'STARS.MY_TRIGGER'
how to solve this....?
can anybody can explain solution for my problem with some good example please ?
thanksHi,
From Documentation
mutating table is a table that is currently 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, and statement triggers that are fired as the result of a DELETE CASCADE
To avoid..an article by tom kyte.
http://asktom.oracle.com/pls/asktom/ASKTOM.download_file?p_file=6551198119097816936
Hope it helps,
CKLP -
Trying to automatically add a new row w/o mutating table error...
I'm using Oracle 10g express. I'm trying to automatically add a new row with the same e_ID, (RDD + 6 months) as the updated row when RC is updated. I'm fairly new to Oracle, so I need some help on creating a trigger. If you need more details let me know. Thanks in advance.
create table E
e_id number(6,0) not null,
constraint e_pk primary key(e_id)
create Table ER
e_Id Number(6,0) Not Null,
SC Date,
RDD Date,
RC Date,
Constraint ER_Fk Foreign Key(E_Id) References E(E_Id)
);mookjais wrote:
I'm using Oracle 10g express. I'm trying to automatically add a new row with the same e_ID, (RDD + 6 months) as the updated row when RC is updated. I'm fairly new to Oracle, so I need some help on creating a trigger. If you need more details let me know. Thanks in advance.
create table E
e_id number(6,0) not null,
constraint e_pk primary key(e_id)
create Table ER
e_Id Number(6,0) Not Null,
SC Date,
RDD Date,
RC Date,
Constraint ER_Fk Foreign Key(E_Id) References E(E_Id)
);Do you mean following(example)?
create trigger after_insert_e
after
insert
on e /*This is table name*/
referencing new as new old as old
for each row
begin
insert into ER(e_Id,SC,rdd,rc)
values(:new.ed_id,sysdate,sysdate,sysdate);
end; -
ORA-04091: table is mutating, trigger/function
I am using oracle 11g R2 - 11.2.0.1
I have following function to fetch the ID from name supplied
create or replace
FUNCTION get_group_id
(p_groupname IN group_list.groupname%TYPE)
RETURN group_list.group_id%TYPE
AS
v_group_id group_list.group_id%TYPE;
BEGIN
SELECT group_list.group_id
INTO v_group_id
FROM group_list
WHERE group_list.groupname = p_groupname;
RETURN v_group_id;
END get_group_id;
and I am doing simple update command to the table, but its giving me ORA-04091 error. Any help is appreciated
update GROUP_LIST set MGR_GROUP_ID = get_group_id('manager1') where group_id = get_group_id('employee51');
Error which I am getting is -
Error report:
SQL Error: ORA-04091: table is mutating, trigger/function may not see it
ORA-06512: at "GET_GROUP_ID", line 7
04091. 00000 - "table %s.%s is mutating, trigger/function may not see it"
*Cause: A trigger (or a user defined plsql function that is referenced in
this statement) attempted to look at (or modify) a table that was
in the middle of being modified by the statement which fired it.
*Action: Rewrite the trigger (or function) so it does not read that table.>
and I am doing simple update command to the table, but its giving me ORA-04091 error. Any help is appreciated
update GROUP_LIST set MGR_GROUP_ID = get_group_id('manager1') where group_id = get_group_id('employee51');
Error which I am getting is -
Error report:
SQL Error: ORA-04091: table is mutating, trigger/function may not see it
>
And do you have a trigger on the GROUP_LIST table that calls you function that queries the GROUP_LIST table?
The solution is simple: DON'T DO THAT!
See Trigger Restrictions on Mutating Tables in the SQL Language doc
http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/triggers.htm#g1699708
Trigger Restrictions on Mutating Tables
A mutating table is a table that is being modified by an UPDATE, DELETE, or INSERT statement, or a table that might be updated by the effects of a DELETE CASCADE constraint.
The session that issued the triggering statement cannot query or modify a mutating table. This restriction prevents a trigger from seeing an inconsistent set of data.
This restriction applies to all triggers that use the FOR EACH ROW clause. Views being modified in INSTEAD OF triggers are not considered mutating.
When a trigger encounters a mutating table, a run-time error occurs, the effects of the trigger body and triggering statement are rolled back, and control is returned to the user or application. (You can use compound triggers to avoid the mutating-table error. For more information, see Using Compound Triggers to Avoid Mutating-Table Error.)
Consider the following trigger:
CREATE OR REPLACE TRIGGER Emp_count
. . . -
Mutating Trigger error while updating table
Hi Guys,
I am updating one table and after trigger also fire at the same time. Now, I want to avoid mutating trigger error. Can any one help me on this.
Thanks in advance!
Regards,
-LRKYou'll have to read these articles first, they explain what's the problem and how to deal with it:
http://www.oracle-base.com/articles/9i/MutatingTableExceptions.php
http://asktom.oracle.com/pls/asktom/ASKTOM.download_file?p_file=6551198119097816936
but, as Saubhik already said, using Oracle's AUDIT functionality would be the way to go.
http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_4007.htm
Using an autonomous transaction can result in corrupted data or unexpected errors, stay away from them if you want to use them in order to bypass/hide your mutating table error. -
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 -
I am confused. I thought that if you tried to query a table from a BEFORE ROW trigger, which was the actual table upon which the BEFORE ROW trigger was applied against, you would get a MUTATING TABLE ERROR. For instance, I did not think that this would work:
SQL> create table check_mte (tk number,
2 group_id number,
3 date_begin date,
4 date_end date);
Table created.
SQL> create or replace
2 trigger check_mte
3 before insert
4 on check_mte
5 for each row
6 declare
7 wk_cnt number;
8 begin
9 select count(*) into wk_cnt
10 from check_mte a
11 where a.tk != :new.tk
12 and a.group_id = :new.group_id
13 and (:new.date_begin, :new.date_end) overlaps (a.date_begin, a.date_end);
14
15 if wk_cnt = 1 then
16 raise_application_error(-20500, 'Overlapping date range error.');
17 end if;
18
19 end check_mte;
20 /
Trigger created.
SQL> insert into check_mte values (1, 1, trunc(sysdate), trunc(sysdate)+1);
1 row created.
SQL> insert into check_mte values (2, 1, trunc(sysdate)+1, trunc(sysdate)+2);
1 row created.
SQL> insert into check_mte values (3, 1, trunc(sysdate)+2, trunc(sysdate)+3);
1 row created.
SQL> select * from check_mte;
TK GROUP_ID DATE_BEGI DATE_END
1 1 25-OCT-10 26-OCT-10
2 1 26-OCT-10 27-OCT-10
3 1 27-OCT-10 28-OCT-10
SQL> insert into check_mte values (4, 2, trunc(sysdate), trunc(sysdate)+1);
1 row created.
SQL> insert into check_mte values (5, 2, trunc(sysdate), trunc(sysdate)+1);
insert into check_mte values (5, 2, trunc(sysdate), trunc(sysdate)+1)
ERROR at line 1:
ORA-20500: Overlapping date range error.
ORA-06512: at "CHECK_MTE", line 11
ORA-04088: error during execution of trigger 'CHECK_MTE'Why is this not generating a Mutating Table Error?
--=ChuckIt's a multi-row update that causes the issue, not a single row update:
SQL> insert into check_mte select * from check_mte;
insert into check_mte select * from check_mte
ERROR at line 1:
ORA-04091: table CHECK_MTE is mutating, trigger/function may not see it
ORA-06512: at "CHECK_MTE", line 4
ORA-04088: error during execution of trigger CHECK_MTE' -
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. -
Mutating table and recursive triggers
Hello every one,
I seem to be having a problem with a statement level update trigger. I want to use a trigger on a table then update the same table. Initially when I coded it as a row trigger but I received a ORA 04091 mutating error message.
I refered a Oracle PL/SQL book and it suggested a work around. I recoded the trigger but it is not working. Oracle does not want to let me update the table I am running my statement level trigger(accompanied with a package and row level trigger) on. Please see code below. CREATE OR REPLACE PACKAGE service_guarantee_cap_data AS
TYPE t_userid is table of bizguaranteereq.userid%type
index by BINARY_INTEGER;
TYPE t_recordid is table of bizguaranteereq.recordid%type
index by BINARY_INTEGER;
v_userid t_userid;
v_recordid t_recordid;
v_NumEntries BINARY_INTEGER :=0;
end service_guarantee_cap_data;
CREATE OR REPLACE TRIGGER service_guar_cap_row_update
BEFORE UPDATE of statuscd ON bizguaranteereq
FOR EACH ROW
BEGIN
service_guarantee_cap_data.v_NumEntries := service_guarantee_cap_data.v_NumEntries + 1;
service_guarantee_cap_data.v_userid(service_guarantee_cap_data.v_NumEntries ):= :new.userid;
service_guarantee_cap_data.v_recordid(service_guarantee_cap_data.v_NumEntries ) := :new.recordid;
END service_guar_cap_row_update;
CREATE OR REPLACE TRIGGER service_guar_cap_stat_update
after UPDATE of statuscd ON bizguaranteereq
DECLARE
v_rowid_2 number;
v_userid_2 number;
v_recordid_2 number;
v_overcap_99 number;
BEGIN
v_0 := 0;
v_overcap_99 := 99;
FOR v_loopindex in 1..service_guarantee_cap_data.v_NumEntries LOOP
v_userid_2 := service_guarantee_cap_data.v_userid(v_loopindex);
v_recordid_2 := service_guarantee_cap_data.v_recordid(v_loopindex);
select count(*)
into v_statuscd_count
from bizguaranteereq
where userid=v_userid_2
and statuscd=99;
IF v_statuscd_count > 0
THEN
update bizguaranteereq
set statuscd=v_overcap_99
where userid = v_userid_2
and recordid=v_recordid_2;
END IF;
END LOOP;
service_guarantee_cap_data.v_NumEntries := v_0;
END service_guar_cap_stat_update;I did not receive a mutating error with my work around code. I think the problem lies with the update DML. I will try your suggestion of an external proceedure that takes the parameter given from the statment level trigger and then updates the table using the proceedure.
Thanks
<BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica">quote:</font><HR>Originally posted by wasim hamwi ([email protected]):
I am not sure this code will work, you will get mutating table because you are selecting the count(*) from the sam table you are tying to update....use Autonomous_transaction if your Db iv V8.1.5 or higher.
Wasim<HR></BLOCKQUOTE>
null -
Mutating table and row state - this was unexpected
So, I learned in a class about 3 years ago to expect the following
SQL> create table p (pk number primary key);
Table created.
SQL> create table c (fk number references p(pk));
Table created.
SQL> create or replace trigger t_insrt
2 before insert on p
3 for each row
4 begin
5 insert into c values (:new.pk);
6 end;
7 /
Trigger created.
SQL> insert into p values (1);
insert into p values (1)
ERROR at line 1:
ORA-02291: integrity constraint (FORBESC.SYS_C00169150) violated - parent key
not found
ORA-06512: at "FORBESC.T_INSRT", line 2
ORA-04088: error during execution of trigger 'FORBESC.T_INSRT'and so it led me to think that replicating ON MODIFY PARENT - MODIFY CHILD functionality wouldn't work in a BEFORE ROW trigger, but it does
SQL> drop trigger t_insrt;
Trigger dropped.
SQL> create or replace trigger p_updt
2 before update on p
3 for each row
4 begin
5 update c
6 set fk = :new.pk
7 where fk = :old.pk;
8 end;
9 /
Trigger created.
SQL> insert into p values (1);
1 row created.
SQL> insert into c values (1);
1 row created.
SQL> select * from c;
FK
1
SQL> update p
2 set pk = 2
3 where pk = 1;
1 row updated.
SQL> select * from c;
FK
2Why would the first scenario fail while the second succeeds? The update seems prone to a parent record also not existing, at least not by the BEFORE ROW trigger.
---=Chuck< mutating table and row state >
BTW, you don't seem to have run into the mutating table error though 2 other threads today are also about it. You have a constraint violation, a different thing entirely.
I believe the second scenario works because you're neatly avoiding the error of the first. The error "ORA-02291: integrity constraint (FORBESC.SYS_C00169150) violated" means that on insert Oracle is looking up the value you're trying to insert, not finding it, and raising an error. With the before trigger you are taking the assigned value from the insert, updating the parent to it, so that on actual insert when the check happens the value is there due to the update.
I'm not convinced this is a good idea because any on-the-fly approach to data entry needs to be examined carefully. -
I have a trigger that fires when field A is updated.
I would like to use field A to obtain a field in another table B
and update the table that the trigger is on with the value of field B.
I know that this would create a mutating table error, but I was wondering if there is any workaround. I have tried to use a statement level after update trigger and a row level before update trigger together on that table yet a continuous loop is created bc the statement level trigger updates the table which again fires the row level trigger.
Are there any other workarounds for updating the same table that the trigger is firing on?Even if there is a foreign key from a to b, you can do something like this (a single row trigger) without causing a mutation issue:
create or replace trigger a_trigger
before insert or update on a
for each row
begin
select name
into :new.fk_name
from b
where pk = :new.fk;
end;
/
Maybe you are looking for
-
Multiple Crypto Maps on Single Outside Interface
Hi, I had the following crypto map configured on my ASA5505 to allow Cisco IPSec VPN clients to connect from the outside: crypto dynamic-map SYSTEM_DEFAULT_CRYPTO_MAP 65535 set pfs group1 crypto dynamic-map SYSTEM_DEFAULT_CRYPTO_MAP 65535 set transfo
-
Help with windows 8.1 and java
I have windows 8.1 installed on my laptop and i have been trying to print coupons for a website and its not working. says i need java i installed java but that isnt working either. what should i do now?
-
Javascript to create bookmark for page that does not exist yet
Hello all, Is there a way to write js for a bookmark that goes to a page that does not currently exist? For example, I have a 20 page pdf document. We have FileMaker Pro that can 'append' to a PDF additional pages. So when FileMaker pro appends two
-
Can I send an HTTP Header from an iView
Hello Developers, I'm trying to run an external web application from a URL iView. In the URL I point it to a reverse proxy that starts the web application. The reverse proxy requires a user name in the field HTTP_USER. Sending a value as a URL Par
-
Hello to all, I have a Problem with some 1252 AP. We have installed in a Branch two 4402 (25) Controller. Both Controller work without Problems. We have also installed some other AP´s on this Controller. Version is 7.0.98 Now my Problem. I Connect a