Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

How to check for record exists prior to an Insert statement

937861Aug 12 2012 — edited Aug 13 2012
Using a cursor and loop method records are inserted into the header and line tables. How do I code the IF statement prior to the INSert statement such that Insert if record does not exist else Update the record. If the record for insert fails in the line, the same record should be deleted from the header table as well and transaction should rollback. The Ora version used is 11.2.0.2.
CURSOR C1 IS
        SELECT H.*
        FROM   rex_head_extract h
        WHERE  TRUNC(h.create_date) BETWEEN v_begin_date AND v_end_date;   

 FOR I IN C1 (v_begin_date, v_end_date)
           LOOP
              v_record_count := v_record_count + 1;

              SELECT kcpos_tran_seq.nextval
              INTO   l_tran_seq_nbr
              FROM   dual;

--- Need to perform a check if record exists here prior to insert      
             INSERT INTO tran_head
                 (TRAN_SEQ_NBR,        ORG_NUMBER,
                  STORE_NUMBER,        TRAN_DATE,
                  TERMINAL_NUMBER,     TRAN_NUMBER,
                  TRAN_TIME,           BATCH_NUMBER)
              	VALUES (l_tran_seq_nbr, 1,
                      I.store_number, I.tran_date,
                      I.terminal_number, I.tran_number,
                      I.tran_time, I.batch_number);

 	INSERT INTO tran_line
                 (TRAN_SEQ_NBR, TRAN_LINE_NBR, ORG_NUMBER,
                  STORE_NUMBER,        TRAN_DATE,
                  TERMINAL_NUMBER,     TRAN_NUMBER,
                  TRAN_TIME,           TRAN_TYPE,
                  SUB_TRAN_TYPE)
      		SELECT  l_tran_seq_nbr, tran_line_nbr, 1,
                      store_number, tran_date,
                      terminal_number, tran_number,
                      tran_time, tran_type,
                      sub_tran_type
        	FROM   rex_line_extract
              	WHERE   rex_seq_nbr = I.rex_seq_nbr
              		AND     revision_number = I.revision_number
              		AND     store_number    = I.store_number
              		AND     tran_date       = I.tran_date
              		AND     terminal_number = I.terminal_number
              		AND     tran_number     = I.tran_number;
 	END LOOP;
Source DDL for rex_head_extract
CREATE TABLE REX_HEAD_EXTRACT
(
  REX_SEQ_NBR         NUMBER(20)            NOT NULL,
  LOAD_ID             NUMBER(10)            NOT NULL,
  REVISION_NUMBER         NUMBER(3)             NOT NULL,
  DAY                     NUMBER(3)             NOT NULL,
  RESA_TRAN_SEQ_NO        NUMBER(20)            NOT NULL,
  BUSINESS_DATE           DATE                  NOT NULL,
  TRAN_SEQ_NBR            NUMBER(12),
  ORG_NUMBER              NUMBER,
  STORE_NUMBER            NUMBER,
  TRAN_DATE               DATE,
  TERMINAL_NUMBER         NUMBER,
  TRAN_NUMBER             NUMBER,
  TRAN_TIME               DATE,
  BATCH_NUMBER            VARCHAR2(8 BYTE),
  BATCH_TYPE              VARCHAR2(4 BYTE),
  TRAN_TYPE               VARCHAR2(4 BYTE),
  SUB_TRAN_TYPE           VARCHAR2(4 BYTE),
  DISC_TOTAL              NUMBER(9,2)
)



CREATE INDEX REX_HEAD_EXTRACT_NDX ON REX_HEAD_EXTRACT
(STORE_NUMBER, TRUNC("TRAN_TIME"), TERMINAL_NUMBER, TRAN_NUMBER, REVISION_NUMBER);


CREATE INDEX REX_HEAD_EXTRACT_NDX1 ON REX_HEAD_EXTRACT
(STORE_NUMBER, TRAN_DATE, TERMINAL_NUMBER, TRAN_NUMBER, REVISION_NUMBER);


CREATE INDEX REX_HEAD_EXTRACT_NDX2 ON REX_HEAD_EXTRACT
(BCF_LOAD_ID);


CREATE INDEX REX_HEAD_EXTRACT_NDX3 ON REX_HEAD_EXTRACT
(REX_SEQ_NBR, REVISION_NUMBER, STORE_NUMBER, TRAN_DATE, TERMINAL_NUMBER, 
TRAN_NUMBER);


CREATE UNIQUE INDEX XPK_REX_HEAD_EXTRACT_1 ON REX_HEAD_EXTRACT
(BCF_REX_SEQ_NBR, TRAN_DATE);



ALTER TABLE REX_HEAD_EXTRACT ADD (
  CONSTRAINT XPKREX_HEAD_EXTRACT_1
  PRIMARY KEY
  (REX_SEQ_NBR, TRAN_DATE)
  USING INDEX XPK_REX_HEAD_EXTRACT_1);
DDL - source for REX_LINE_EXTRACT
CREATE TABLE REX_LINE_EXTRACT
(
  REX_SEQ_NBR      NUMBER(20)               NOT NULL,
  REVISION_NUMBER      NUMBER                   NOT NULL,
  DAY                  NUMBER(3)                NOT NULL,
  RESA_TRAN_SEQ_NO     NUMBER(20)               NOT NULL,
  BUSINESS_DATE        DATE                     NOT NULL,
  TRAN_SEQ_NBR         NUMBER(12),
  TRAN_LINE_NBR        NUMBER                   NOT NULL,
  ORG_NUMBER           NUMBER,
  STORE_NUMBER         NUMBER,
  TRAN_DATE            DATE                     NOT NULL,
  TERMINAL_NUMBER      NUMBER,
  TRAN_NUMBER          NUMBER,
  TRAN_TIME            DATE,
  TRAN_TYPE            VARCHAR2(4 BYTE),
  SUB_TRAN_TYPE        VARCHAR2(4 BYTE))


CREATE INDEX REX_LINE_EXTRACT_NDX ON REX_LINE_EXTRACT
(STORE_NUMBER, TRAN_DATE, TERMINAL_NUMBER, TRAN_NUMBER, REVISION_NUMBER);


CREATE INDEX REX_LINE_EXTRACT_NDX2 ON REX_LINE_EXTRACT
(REX_SEQ_NBR, REVISION_NUMBER, STORE_NUMBER, TRAN_DATE, TERMINAL_NUMBER, 
TRAN_NUMBER)
Target table DDL - Tran_Head
CREATE TABLE TRAN_HEAD
(
  TRAN_SEQ_NBR            NUMBER(12),
  ORG_NUMBER              NUMBER,
  STORE_NUMBER            NUMBER,
  TRAN_DATE               DATE,
  TERMINAL_NUMBER         NUMBER,
  TRAN_NUMBER             NUMBER,
  TRAN_TIME               DATE,
  BATCH_NUMBER            VARCHAR2(8 BYTE),
  BATCH_TYPE              VARCHAR2(4 BYTE),
  TRAN_TYPE               VARCHAR2(4 BYTE),
  SUB_TRAN_TYPE           VARCHAR2(4 BYTE));

ALTER TABLE TRAN_HEADER ADD (
  CONSTRAINT XPKKCPOS_TRAN_HEADER_1
  PRIMARY KEY
  (TRAN_SEQ_NBR, TRAN_DATE)
  USING INDEX LOCAL)
Target table DDL - Tran Line
CREATE TABLE TRAN_LINE
(
  TRAN_SEQ_NBR         NUMBER(12),
  TRAN_LINE_NBR        NUMBER,
  ORG_NUMBER           NUMBER,
  STORE_NUMBER         NUMBER,
  TRAN_DATE            DATE,
  TERMINAL_NUMBER      NUMBER,
  TRAN_NUMBER          NUMBER,
  TRAN_TIME            DATE,
  TRAN_TYPE            VARCHAR2(4 BYTE));

ALTER TABLE TRAN_LINE ADD (
  CONSTRAINT XPK_TRAN_LINE
  PRIMARY KEY
  (TRAN_SEQ_NBR, TRAN_LINE_NBR, TRAN_DATE)
  USING INDEX LOCAL);
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Sep 10 2012
Added on Aug 12 2012
9 comments
1,466 views