5

あるスキーマのデータの一部を別のサーバーの別のスキーマに転送するデータ移行 pl/sql スクリプトを作成しようとしています。2 番目のデータベースは元のデータベースのサブセットとして開始されましたが、スキーマを変更しました。したがって、各テーブルに次のものを使用することはできません。

Insert into DB2.table_name select * from DB1.table_name2; 

これを行う方法を示すサンプル スクリプトを検索しようとしましたが、何も見つかりませんでした。

4

3 に答える 3

3

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;
于 2009-12-08T16:51:27.297 に答える
1

データベース リンクを作成できます。

次に、db1 から db2 に移行しようとしている場合:

Insert into table_name (f1, f2, etc) select (f1, f2, etc) from table_name2@DB2;

選択は、必要に応じて複雑にすることも単純にすることもできます。

于 2009-12-08T19:53:10.177 に答える
0

これを頻繁に行う必要がある場合は、スキーマ同期ツールを使用することもできます。Toad、dbsolo、およびおそらく他のいくつかのツールを使用できます。時間と労力を大幅に節約できました。

于 2009-12-08T19:47:49.437 に答える