Hi All, I have 2 questions related to Merge.
Below is the code related to that:

CREATE TABLE TAB_SEQ_NAME
(TABLE_NAME VARCHAR2(50),
SEQ_NAME VARCHAR2(50));

INSERT INTO TAB_SEQ_NAME VALUES('TAB1', 'TAB1_SEQ');
INSERT INTO TAB_SEQ_NAME VALUES('TAB2', 'TAB2_SEQ');

CREATE TABLE TAB_KEYS
(TABLE_NAME VARCHAR2(50),
SOURCE_KEY NUMBER,
TARGET_KEY NUMBER);

INSERT INTO TAB_KEYS VALUES('TAB1', 7, NULL);
INSERT INTO TAB_KEYS VALUES('TAB1', 4, NULL);
INSERT INTO TAB_KEYS VALUES('TAB1', 9, NULL);
INSERT INTO TAB_KEYS VALUES('TAB1', 3, NULL);
INSERT INTO TAB_KEYS VALUES('TAB2', 23, NULL);
INSERT INTO TAB_KEYS VALUES('TAB2', 20, NULL);
INSERT INTO TAB_KEYS VALUES('TAB2', 4, NULL);
INSERT INTO TAB_KEYS VALUES('TAB2', 1, NULL);

CREATE SEQUENCE TAB1_SEQ
    MINVALUE 200
    MAXVALUE 999999999999999999999999999
    START WITH 200
    INCREMENT BY 1;

CREATE SEQUENCE TAB2_SEQ
    MINVALUE 100
    MAXVALUE 999999999999999999999999999
    START WITH 100
    INCREMENT BY 1;



SET SERVEROUTPUT ON;
DECLARE
V_SQL VARCHAR2(1000);
BEGIN
  FOR I IN (SELECT TABLE_NAME, SEQ_NAME
            FROM TAB_SEQ_NAME) LOOP
  V_SQL := 'MERGE INTO TAB_KEYS TGT
  USING (SELECT A.TABLE_NAME, A.SOURCE_KEY, A.TARGET_KEY, B.SEQ_NAME
        FROM TAB_KEYS A, TAB_SEQ_NAME B
        WHERE A.TABLE_NAME = B.TABLE_NAME
        AND A.TABLE_NAME = ''' || I.TABLE_NAME ||
        ''' ORDER BY A.SOURCE_KEY) SRC
  ON ( TGT.TABLE_NAME = SRC.TABLE_NAME AND TGT.SOURCE_KEY=SRC.SOURCE_KEY)
  WHEN MATCHED THEN
  UPDATE SET TGT.TARGET_KEY = ' || I.SEQ_NAME || '.NEXTVAL';

DBMS_OUTPUT.PUT_LINE(V_SQL);

END LOOP;
END;
/
Output:

MERGE INTO TAB_KEYS TGT
  USING (SELECT A.TABLE_NAME, A.SOURCE_KEY, A.TARGET_KEY, B.SEQ_NAME
        FROM TAB_KEYS A, TAB_SEQ_NAME B
        WHERE A.TABLE_NAME = B.TABLE_NAME
        AND A.TABLE_NAME = 'TAB1' ORDER BY A.SOURCE_KEY) SRC
  ON ( TGT.TABLE_NAME = SRC.TABLE_NAME AND TGT.SOURCE_KEY=SRC.SOURCE_KEY)
  WHEN MATCHED THEN
  UPDATE SET TGT.TARGET_KEY = TAB1_SEQ.NEXTVAL;

MERGE INTO TAB_KEYS TGT
  USING (SELECT A.TABLE_NAME, A.SOURCE_KEY, A.TARGET_KEY, B.SEQ_NAME
        FROM TAB_KEYS A, TAB_SEQ_NAME B
        WHERE A.TABLE_NAME = B.TABLE_NAME
        AND A.TABLE_NAME = 'TAB2' ORDER BY A.SOURCE_KEY) SRC
  ON ( TGT.TABLE_NAME = SRC.TABLE_NAME AND TGT.SOURCE_KEY=SRC.SOURCE_KEY)
  WHEN MATCHED THEN
  UPDATE SET TGT.TARGET_KEY = TAB2_SEQ.NEXTVAL;




Here are my questions:
1. When the statements are executed, I need the seq val to be generated as
per the order of the source_key.

I got this

TAB1 7 204
TAB1 4 205
TAB1 3 206
TAB1 9 207

but How can i get?

TAB1 3 204
TAB1 4 205
TAB1 7 206
TAB1 9 207

2. I am using the loop to substitute the seq name which is in the column.
Can the loop be avoided with just one merge statement?

Thanks in advance.

-- 
You received this message because you are subscribed to the Google
Groups "Oracle PL/SQL" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/Oracle-PLSQL?hl=en

Reply via email to