有没有人有一个示例数据迁移脚本(Oracle 10g到Oracle 10g,但不同的模式)?

时间:2009-12-08 16:31:03

标签: oracle plsql oracle10g data-migration

我正在尝试编写数据迁移pl / sql脚本,以将一个模式中的一些数据传输到另一个服务器上的不同模式。第二个数据库作为原始数据库的子集启动,但我们已修改了架构。所以我不能只为每个表使用以下内容:

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

我尝试过搜索示例如何执行此操作的示例脚本,但找不到任何内容。

3 个答案:

答案 0 :(得分:3)

如果DB1.table_name和DB2.table_name之间的列不同,那么您将不得不在insert语句中指定列列表。不幸的是,这里并没有真正的“神奇子弹”。

话虽如此,为了加快进程,你可以编写一些PL / SQL来生成insert语句,然后你可以手动修复它们。这是一个用于执行此操作的示例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;

答案 1 :(得分:1)

你可以create a database link

然后,如果您尝试从db1迁移到db2:

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

选择可以根据需要复杂或简单。

答案 2 :(得分:0)

如果您需要经常这样做,那么另一种选择是使用架构同步工具。可以使用Toad,dbsolo和其他一些工具。它为我节省了大量的时间和精力。