Wednesday, February 26, 2014

How to create tables with sequences and triggers on Oracle database

In this example I work on 2 tables EXAMPLE_DETAILS and EXAMPLE_DETAILS_HISTORY

The scenario is, whenever a row in EXAMPLE_DETAILS gets updated or deleted, the old record should be sent to history table (EXAMPLE_DETAILS_HISTORY)

 CREATE TABLE SCHEMA.EXAMPLE_DETAILS
  (
  DETAIL_ID  INTEGER    NOT NULL,
  UNIQUE_ID             INTEGER ,
  TABLE_NAME            VARCHAR2(30 BYTE),
  EXAMPLE_DATE          DATE,
  EXAMPLE_REF           INTEGER,  
  EXAMPLE_COMMENTS      VARCHAR2(4000 BYTE),
  CONSTRAINT DETAIL_ID_PK PRIMARY KEY (DETAIL_ID)
  )

CREATE SEQUENCE SCHEMA.EXAMPLE_DETAILS_SEQ
  START WITH 199
  MAXVALUE 999999999999999999999999999
  MINVALUE 0
  NOCYCLE
  NOCACHE
  NOORDER;

CREATE OR REPLACE TRIGGER EXAMPLE_HISTORY_TRIGGER
   BEFORE DELETE 
   ON EXAMPLE_DETAILS
   FOR EACH ROW
BEGIN
   INSERT INTO EXAMPLE_DETAILS_HISTORY (EXAMPLE_HISTORY_ID,
                                         UNIQUE_ID,
                                         TABLE_NAME,
                                         HISTORY_DATE,
                                         EXAMPLE_DATE,
                                         EXAMPLE_ACTION_REF,
                                         EXAMPLE_COMMENTS)
        VALUES (EXAMPLE_HISTORY_SEQ.NEXTVAL,
                :old.UNIQUE_ID,
                :old.TABLE_NAME,
                SYSDATE,
                :EXAMPLE_DATE,
                :EXAMPLE_REF,
                :EXAMPLE_COMMENTS);
END;
/
CREATE OR REPLACE TRIGGER EXAMPLE_DETAILS_TRG BEFORE insert OR update ON EXAMPLE_DETAILS
  FOR EACH ROW
BEGIN
  :new.EXAMPLE_DATE := sysdate ;
END;
/
CREATE OR REPLACE TRIGGER EXAMPLE_DETAILS_UPDATETRG AFTER update ON EXAMPLE_DETAILS
  FOR EACH ROW
BEGIN
IF :OLD.EXAMPLE_REF!=:NEW.EXAMPLE_REF OR :OLD.EXAMPLE_COMMENTS!=:NEW.EXAMPLE_COMMENTS
THEN
  INSERT INTO EXAMPLE_DETAILS_HISTORY (EXAMPLE_HISTORY_ID,
                                        UNIQUE_ID,
                                        TABLE_NAME,
                                        HISTORY_DATE,
                                        EXAMPLE_DATE,
                                         EXAMPLE_ACTION_REF,
                                         EXAMPLE_COMMENTS)
        VALUES ( EXAMPLE_HISTORY_SEQ.NEXTVAL,
                :old.UNIQUE_ID,
                :old.TABLE_NAME,
                SYSDATE,
                :old. EXAMPLE_DATE,
                :old. EXAMPLE_ACTION_REF,
                :old. EXAMPLE_COMMENTS);
  END IF;
END;
/
********************************************************************************************

CREATE TABLE SCHEMA.EXAMPLE_DETAILS_HISTORY
(
  EXAMPLE_HISTORY_ID INTEGER    NOT NULL,
  UNIQUE_ID         INTEGER NOT NULL,
  TABLE_NAME        VARCHAR2(30 BYTE),
  HISTORY_DATE           DATE,
  EXAMPLE_DATE           DATE,
  EXAMPLE_REF            INTEGER,  
  EXAMPLE_COMMENTS VARCHAR2(4000 BYTE),    
  CONSTRAINT HISTORY_ID_PK PRIMARY KEY (EXAMPLE_HISTORY_ID)     
)


CREATE SEQUENCE SCHEMA.EXAMPLE_DETAILS_HISTORY_SEQ
  START WITH 199
  MAXVALUE 999999999999999999999999999
  MINVALUE 0
  NOCYCLE
  NOCACHE
  NOORDER;     
 

No comments:

Post a Comment