Skip to content

oracle generate table merge script

/* Formatted on 22/2/2023 1:59:36 pm (QP5 v5.391) */
DECLARE
    all_s_col        VARCHAR2 (30000);
    all_update_set   VARCHAR2 (30000);
    all_insert       VARCHAR2 (30000);
    one_col          VARCHAR2 (1000);
    res              VARCHAR2 (1000);
    source_table     VARCHAR2 (4000);
    target_table     VARCHAR2 (4000);
    sql_merge        VARCHAR2 (30000);
    all_join         VARCHAR2 (30000);

    CURSOR c1 (table_name_in VARCHAR2)
    IS
          SELECT col.column_name
            FROM sys.all_tab_columns col INNER JOIN sys.all_tables t ON col.owner = t.owner AND col.table_name = t.table_name
           WHERE col.owner = 'ADMIN' AND col.table_name = UPPER (table_name_in)
        ORDER BY col.column_id;
    TYPE v_list_tab IS TABLE OF VARCHAR2 (32767);
    key_list := v_list_tab('aa');

BEGIN
    source_table := 'table1';
    target_table := 'table2';

    FOR l_row IN 1 .. key_list.COUNT
    LOOP
        all_join := all_join || 's.' || key_list (l_row) || ' = t.' || key_list (l_row) || ' and ';
    END LOOP;

    OPEN c1 (source_table);

    LOOP
        FETCH c1 INTO one_col;

        EXIT WHEN c1%NOTFOUND;
        all_s_col := all_s_col || one_col || ',';
        all_update_set := all_update_set || 't.' || one_col || ' = s.' || one_col || ',';
        all_insert := all_insert || 's.' || one_col || ',';
    END LOOP;

    CLOSE c1;

    all_s_col := SUBSTR (all_s_col, 1, LENGTH (all_s_col) - 1);
    all_update_set := SUBSTR (all_update_set, 1, LENGTH (all_update_set) - 1);
    all_insert := SUBSTR (all_insert, 1, LENGTH (all_insert) - 1);
    all_join := SUBSTR (all_join, 1, LENGTH (all_join) - 5);



    -- Both clauses present.
    sql_merge := 'MERGE INTO ' || target_table || ' t' || CHR (10);
    sql_merge := sql_merge || ' USING (select ' || all_s_col || '  from ' || source_table || ') ' || CHR (10);
    sql_merge := sql_merge || 'ON (' || all_join || ')' || CHR (10);
    sql_merge := sql_merge || ' WHEN MATCHED THEN' || CHR (10);
    sql_merge := sql_merge || 'UPDATE SET ' || all_update_set || '' || CHR (10);
    sql_merge := sql_merge || ' WHEN NOT MATCHED THEN' || CHR (10);
    sql_merge := sql_merge || 'INSERT ( ' || all_s_col || ')' || CHR (10);
    sql_merge := sql_merge || 'VALUES (' || all_insert || ')' || CHR (10);
    sql_merge := sql_merge || '   ' || CHR (10);

    DBMS_OUTPUT.put_line (sql_merge);
END;