Showing posts with label create table. Show all posts
Showing posts with label create table. Show all posts

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;