oracle - 有谁有示例数据迁移脚本(Oracle 10g 到 Oracle 10g,但架构不同)?

标签 oracle plsql oracle10g data-migration

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

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

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

最佳答案

如果 DB1.table_name 和 DB2.table_name 之间的列不同,那么您必须在插入语句中指定列列表。不幸的是,这里并没有真正的“ Elixir ”。

话虽如此,为了加快该过程,您可以编写一些 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;

关于oracle - 有谁有示例数据迁移脚本(Oracle 10g 到 Oracle 10g,但架构不同)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1868129/

相关文章:

java - 多对多额外列 eclipselink 不起作用

oracle - 从具有复杂输入和输出类型的 JDBC 调用 Oracle 存储过程

oracle10g - oracle plsql 将变量连接到字符串

sql - oracle sql 获取表中所有可能的组合

java - 从 PL/SQL 调用 java 时出错

linq - 使用 IQ 驱动程序在 LINQPAD 中查询多个 Oracle 模式

java - JPA 查询 - JOIN 子句

oracle - Oracle 中带有子查询的 TRUNC(date)

plsql - dbms_output 语句中的单引号?

oracle - 是否可以在不终止 session 的情况下终止 oracle 中的单个查询?