Thursday, February 9, 2012

Compound Trigger

CREATE TABLE TRIGG_COMPOUND_EXMP_TABLE (
  id           NUMBER,
  description  VARCHAR2(50)
);

CREATE OR REPLACE TRIGGER TRIGG_COMPOUND_EXMP
  FOR INSERT OR UPDATE OR DELETE ON TRIGG_COMPOUND_EXMP_TABLE
    COMPOUND TRIGGER

  -- Global declaration.
  TYPE COLL_T IS TABLE OF VARCHAR2(50);
  OBJ_T COLL_T := COLL_T();

  BEFORE STATEMENT IS
  BEGIN
    OBJ_T.extend;
    CASE
      WHEN INSERTING THEN
        OBJ_T(OBJ_T.last) := 'BEFORE STATEMENT - INSERT';
      WHEN UPDATING THEN
        OBJ_T(OBJ_T.last) := 'BEFORE STATEMENT - UPDATE';
      WHEN DELETING THEN
        OBJ_T(OBJ_T.last) := 'BEFORE STATEMENT - DELETE';
    END CASE;
  END BEFORE STATEMENT;

  BEFORE EACH ROW IS
  BEGIN
    OBJ_T.extend;
    CASE
      WHEN INSERTING THEN
        OBJ_T(OBJ_T.last) := 'BEFORE EACH ROW - INSERT (new.id=' || :new.id || ')';
      WHEN UPDATING THEN
        OBJ_T(OBJ_T.last) := 'BEFORE EACH ROW - UPDATE (new.id=' || :new.id || ' old.id=' || :old.id || ')';
      WHEN DELETING THEN
        OBJ_T(OBJ_T.last) := 'BEFORE EACH ROW - DELETE (old.id=' || :old.id || ')';
    END CASE;
  END BEFORE EACH ROW;

  AFTER EACH ROW IS
  BEGIN
    OBJ_T.extend;
    CASE
      WHEN INSERTING THEN
        OBJ_T(OBJ_T.last) := 'AFTER EACH ROW - INSERT (new.id=' || :new.id || ')';
      WHEN UPDATING THEN
        OBJ_T(OBJ_T.last) := 'AFTER EACH ROW - UPDATE (new.id=' || :new.id || ' old.id=' || :old.id || ')';
      WHEN DELETING THEN
        OBJ_T(OBJ_T.last) := 'AFTER EACH ROW - DELETE (old.id=' || :old.id || ')';
    END CASE;
  END AFTER EACH ROW;

  AFTER STATEMENT IS
  BEGIN
    OBJ_T.extend;
    CASE
      WHEN INSERTING THEN
        OBJ_T(OBJ_T.last) := 'AFTER STATEMENT - INSERT';
      WHEN UPDATING THEN
        OBJ_T(OBJ_T.last) := 'AFTER STATEMENT - UPDATE';
      WHEN DELETING THEN
        OBJ_T(OBJ_T.last) := 'AFTER STATEMENT - DELETE';
    END CASE;
   
    FOR i IN OBJ_T.first .. OBJ_T.last LOOP
      DBMS_OUTPUT.put_line(OBJ_T(i));
    END LOOP;
    OBJ_T.delete;
  END AFTER STATEMENT;

END TRIGG_COMPOUND_EXMP_trg;
/

No comments: