When a Trigger is created on a table and the trigger code is performing the read operation on the same table, then the mutating happens.
CREATE TRIGGER sample_trigger AFTER INSERT    ON sample_table   FOR EACH ROWlocal_variable NUMBER;BEGIN  IF INSERTING  THEN    SELECT sample_column      INTO local_variable      FROM sample_table;  .  .  .
  END IF;END sample_trigger;To resolve this, we need to store the required values in global variables when row level trigger is fired and create a statement level trigger which uses this global variable.
CREATE PACKAGE sample_package AS  global_variable NUMBER;END sample_package;--row level trigger
CREATE TRIGGER sample_trigger_1 AFTER INSERT    ON sample_table   FOR EACH ROWBEGIN  IF INSERTING  THEN    global_variable := :NEW.sample_column;  END IF;END sample_trigger_1;--statement level trigger
CREATE TRIGGER sample_trigger_2 AFTER INSERT    ON sample_tableBEGIN  IF INSERTING  THEN    local_variable := global_variable;  .  .  .
  END IF;END sample_trigger_2;Disadvantage: It will be useful only when COMMIT happens for each and every row separately. It will not be useful when COMMIT happens after multiple updates. The second trigger fires only after COMMIT and the required operation happens only for the last row.
 
 
No comments:
Post a Comment