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;