Is A Mutating Table Error
Contents |
Social Links Printer Friendly About Search 8i | 9i | 10g | 11g | 12c | 13c | Misc | PL/SQL | SQL mutating trigger in oracle 11g | RAC | WebLogic | Linux Home » Articles » 9i »
Mutating Trigger In Oracle 10g With Example
Here Mutating Table Exceptions Mutating table exceptions occur when we try to reference the triggering table in a mutating trigger with example query from within row-level trigger code. In this article I'll present examples of how a mutating table exception might occur and simple methods to get round it. Test Schema
Oracle Mutating Trigger Pragma Autonomous Transaction
Mutating Table Demonstration Solution 1 (Collection in Package Variable) Solution 2 (Global Temporary Table) Test Schema The following schema objects are necessary to run the code in this article. CREATE TABLE tab1 ( id NUMBER(10) NOT NULL, description VARCHAR2(50) NOT NULL ); ALTER TABLE tab1 ADD ( CONSTRAINT tab1_pk PRIMARY KEY (id) ); CREATE SEQUENCE tab1_seq; CREATE TABLE statement level trigger in oracle tab1_audit ( id NUMBER(10) NOT NULL, action VARCHAR2(10) NOT NULL, tab1_id NUMBER(10), record_count NUMBER(10), created_time TIMESTAMP ); ALTER TABLE tab1_audit ADD ( CONSTRAINT tab1_audit_pk PRIMARY KEY (id) ); ALTER TABLE tab1_audit ADD ( CONSTRAINT tab1_audit_tab1_fk FOREIGN KEY (tab1_id) REFERENCES tab1(id) ); CREATE SEQUENCE tab1_audit_seq; Mutating Table Demonstration Let's assume we need to audit the actions on the parent table and for some reason, this involves querying the triggering table. We can demonstrate this with the following package and trigger. We place all our trigger code into a package as follows. CREATE OR REPLACE PACKAGE trigger_api AS PROCEDURE tab1_row_change (p_id IN tab1.id%TYPE, p_action IN VARCHAR2); END trigger_api; / SHOW ERRORS CREATE OR REPLACE PACKAGE BODY trigger_api AS PROCEDURE tab1_row_change (p_id IN tab1.id%TYPE, p_action IN VARCHAR2) IS l_count NUMBER(10) := 0; BEGIN SELECT COUNT(*) INTO l_count FROM tab1; INSERT INTO tab1_audit (id, action, tab1_id, record_count, created_time) VALUES (tab1_audit_seq.NEXTVAL, p_action, p_id, l_count, SYSTIMESTAMP); END tab1_row_change; END trigger_api; / SHOW ERRORS Next we create the row-level trigger itself to catch any changes to the table. CREATE OR REPLAC
log in tour help Tour Start here for a quick overview of the site Help Center Detailed answers to any questions you might have Meta Discuss the workings and policies of this site About Us Learn more
Pragma Autonomous_transaction In Trigger
about Stack Overflow the company Business Learn more about hiring developers or posting ads
Ora-04091 Solution
with us Database Administrators Questions Tags Users Badges Unanswered Ask Question _ Database Administrators Stack Exchange is a question and answer mutating table error in oracle 11g with example site for database professionals who wish to improve their database skills and learn from others in the community. Join them; it only takes a minute: Sign up Here's how it works: Anybody can ask a https://oracle-base.com/articles/9i/mutating-table-exceptions question Anybody can answer The best answers are voted up and rise to the top What are the causes and solutions for mutating table errors? up vote 7 down vote favorite 1 I understand mutating table errors are caused by a design flaw or problematic query. An old query was recently put into production which throws a mutating table error. Our DBA solved the problem but we do not know http://dba.stackexchange.com/questions/5432/what-are-the-causes-and-solutions-for-mutating-table-errors how. What exactly causes mutating table errors and how would our DBA have fixed the problem? sql oracle trigger plsql share|improve this question edited Jun 25 '15 at 17:56 Mahi_0707 1033 asked Sep 6 '11 at 8:46 parmanand 112238 add a comment| 3 Answers 3 active oldest votes up vote 13 down vote accepted The most likely cause of a mutating table error is the misuse of triggers. Here is a typical example: you insert a row in table A a trigger on table A (for each row) executes a query on table A, for example to compute a summary column Oracle throws an ORA-04091: table A is mutating, trigger/function may not see it This is an expected and normal behaviour, Oracle wants to protect you from yourself since Oracle guarantees: (i) that each statement is atomic (i.e will either fail or succeed completely) (ii) that each statement sees a consistent view of the data Most likely when you write this kind of trigger you would expect the query (2) to see the row inserted on (1). This would be in contradiction with both points above since the update is not finished yet (there could be more rows to be inserted). Oracle could return the result consistent with a
4 ORA-04088: error during execution of trigger 'TRG_GET_ID_APP'. We studied the "Mutating Table" Problem and found the following explanations in the Oracle8i Application Developer's Guide. A mutating table is a table that is currently being modified http://www.akadia.com/services/ora_mutating_table_problems.html by an UPDATE, DELETE, or INSERT statement, or it is a table that might need to be updated by the effects of a declarative DELETE CASCADE referential integrity constraint. The restrictions on such a table apply only to the session that issued the statement in progress. For all row triggers, that were fired as the result of a DELETE CASCADE, there are two important restrictions regarding mutating tables. These restrictions prevent mutating trigger a trigger from seeing an inconsistent set of data. The SQL statements of a trigger cannot read from (query) or modify a mutating table of the triggering statement. Example 1 Select in a mutating table from a row trigger (Tested on Oracle 8.1.7) We want to explain this situation on an example. We have two tables "A" and "B". "A" is the master table and "B" the detail table. We trigger in oracle specified a foreign key between "B" and "A" with the CASCADE DELETE option. Here are the CREATE statements drop table B; drop table A; create table A ( ida number not null, vala varchar2(10), primary key(ida)); create table B ( idb number, valb varchar2(10), foreign key (idb) references A (ida) on delete cascade) / create or replace trigger b_br after delete on B for each row declare n integer; begin select count(*) into n from A; dbms_output.put_line('there are ' || n || ' rows in A'); dbms_output.put_line('after statment on B'); dbms_output.new_line; end; / insert into A values(1,'Table A'); insert into A values(2,'Table A'); insert into B values(1,'Table B'); insert into B values(1,'Table B'); commit; set serveroutput on; delete from A where idA = 1; ERROR at line 1: ORA-04091: table SCOTT.A is mutating, trigger/function may not see ORA-06512: at "SCOTT.B_BR", line 4 ORA-04088: error during execution of trigger 'SCOTT.B_BR' Notice that the SQL statement ( "select count(*) into n from A" ) is run for the first row of the table, and then the AFTER row trigger B_BR is fired. In turn, a statement in the AFTER row trigger body attempts to query the original table A. However, becaus