DB1.table_name と DB2.table_name で列が異なる場合は、insert ステートメントで列リストを指定する必要があります。残念ながら、ここには「特効薬」はありません。
そうは言っても、プロセスを高速化するには、PL/SQL を記述して挿入ステートメントを生成し、手動で修正することができます。これを行うためのサンプル PL/SQL コードを次に示します。この例では、l_src_table がソース テーブルになり、l_target_table がターゲット テーブルになります。明らかに、このコードが生成する SQL ステートメントを手動で修正する必要がありますが、これにより少なくともテンプレート SQL が生成され、多くの時間を節約できます。
DECLARE
l_insert_stmt VARCHAR2(4000);
l_comma VARCHAR2(1) DEFAULT ' ';
l_src_table VARCHAR2(500) := 'TABLE1';
l_src_table_owner VARCHAR2(500) := 'DB1';
l_target_table VARCHAR2(500) := 'TABLE2';
l_target_table_owner VARCHAR2(500) := 'DB2';
BEGIN
l_insert_stmt := 'INSERT INTO ' || l_target_table || ' ( ';
FOR rec IN (SELECT column_name FROM all_tab_columns
WHERE TABLE_name = l_target_table AND owner = l_target_table_owner)
LOOP
l_insert_stmt := l_insert_stmt || l_comma || rec.column_name;
l_comma := ',';
END LOOP;
l_insert_stmt := l_insert_stmt || ' ) ';
l_insert_stmt := l_insert_stmt || ' SELECT ';
l_comma := ' ';
FOR rec IN (SELECT column_name FROM all_tab_columns
WHERE TABLE_name = l_src_table AND owner = l_src_table_owner)
LOOP
l_insert_stmt := l_insert_stmt || l_comma || rec.column_name;
l_comma := ',';
END LOOP;
l_insert_stmt := l_insert_stmt || ' FROM ' || l_src_table;
dbms_output.put_line(l_insert_stmt);
END;