Oracle移植到DB2应该具备这俩个数据库哪些方面的知识,特别是DB2?(暂时以数据库为层面讨论,不计算版本)谢谢各位

解决方案 »

  1.   

    参考:
    http://www.360doc.com/content/08/1226/11/16915_2201788.shtml
      

  2.   

    DB2看过点视频。没有用过,应该到DB2专区问
      

  3.   

     1、用create   table   语句创建好表   
      2、把oracle中数据导出到文本文件中,数据之间以逗号分隔   
      3、在db2的命令行处理器中,连接上数据库,用import   语句导入,语句如下:   
      import   from   c:\test.txt   of   del   insert   into   表名
      

  4.   

    http://www.redbooks.ibm.com/abstracts/sg247048.html?Open
      

  5.   

    就单单将数据从ORACLE搬到DB2的话,应该只需要掌握DB2的基本语法,如表空间建立、表的建立、主外键创建、索引建立、约束建立等。
    而数据移植的过程可以采用文本文件导出在导入的方式,也可以用ETL工具,如BO的Data Integrater,或者MS的SSIS,或者IBM的DS等。这些只需要配置好源数据库和目标数据库的连接,以及表字段之间的映射即可实现数据的迁移,非常简单方便。
      

  6.   

    移植过程中可能遇到的问题:
    DB2 预编译器不能识别声明部分中用户定义的数据类型(typefef,#define macros),位于 EXEC SQL BEGIN DECLARE SECTION 和 EXEC SQL END DECLARE SECTION 语句之间。 
    由于参数类型不同,使用用户定义函数(UDF)(比如 ||、rawtohex、hextoraw,等等)开发的应用程序不能在 DB2 上编译。 
    使用 DECODE 函数的 Oracle 应用程序不能在 DB2 上正确编译。 
    需要在 DB2 中执行与包含 NOWAIT 的 Oracle SQL 语句类似的行为。 
    需要在 DB2 中处理大小超过 32672 的主机变量。 
    当移植到 DB2 时,需要考虑 Oracle 的 “Select for update” 语句
      

  7.   

    Oracle到DB2的流程:   
        
      把Oracle的数据移植到DB2数据库中我们的Java程序起到一个转换器的作用,把Oracle中的不同的数据类型映射为相应的DB2数据库中的类型同时把从Oracle中查询出的数据插入到DB2数据库中从而完成整个移植过程。下面我就结合Java程序给大家是如何实现这一功能的     
        
      1.导入必需的java类     
        
        
      import   java.text.*;   
      import   java.util.*;   
      import   java.io.*;   
      import   java.sql.*;   
      import   java.lang.*;   
        
        
      2.下面是从属性文件中读取在转换器使用的配置信息     
        
        
      //下面的代码是读属性文件的信息   
      Properties   props=new   Properties();   
      File   f=new   File("OracleToDb2.properties");   
      FileInputStream   in=new   FileInputStream(f);   
      props.load(in);   
      String   db2_dbname=props.getProperty("db2_dbname");   
      String   db2_username=props.getProperty("db2_username");   
      String   db2_password=props.getProperty("db2_password");   
      String   oracle_url=props.getProperty("oracle_url");   
      String   oracle_dbname=props.getProperty("oracle_dbname");   
      String   oracle_username=props.getProperty("oracle_username");   
      String   oracle_password=props.getProperty("oracle_password");   
      String   io_tables=props.getProperty("io_tables");   
        
      通过java的输入流来读取文件中的内容   
      其中   
        
      OracleToDb2.properties为属性文件名;     
      db2_dbname,   db2_username,   db2_password   分别为目标DB2数据库的数据库名,数据库用户名,口令。     
      oracle_url   ,oracle_dbname,oracle_username,oracle_password分别为oracle数据库的地址,数据库名,用户名,口令。     
      io_tables为从Oracle移植到DB2的表名   
      下面是属性文件的全部内容:     
      db2_dbname=db2DatabaseName   
      db2_username=db2UserName   
      db2_password=db2Password   
      db2_host=127.0.0.1   
      oracle_url=127.0.0.1   
      oracle_dbname=oracleDatabaseName   
      oracle_username=oracleUsername   
      oracle_password=oraclePassword   
      io_tables=io_tables   
        
        
      3.接着分别建立DB2和ORACLE数据库的连接     
      其中的参数为从属性文件中读入的值,jdbc用的是廋客户机的type4:   
        
        
      DriverManager.registerDriver(new   COM.ibm.db2.jdbc.app.DB2Driver());   
      Class.forName   ("oracle.jdbc.driver.OracleDriver").newInstance   ();   
      Connection   connOra   =   DriverManager.getConnection("jdbc:db2:"+db2_dbname,     db2_username,db2_password);     
      //Connection   connOra   =   DriverManager.getConnection("jdbc:db2://"+db2_host+":"+db2_port+"/"+db2_dbname,     db2_username,db2_password);     
      Connection   connDB2   =DriverManager.getConnection("jdbc:oracle:thin:@"+oracle_url+":1521:"+oracle_dbname,oracle_username,   oracle_password);   
        
      4.转换器的核心java类     
      转换器的核心java类的方法为一个静态的java方法MigrateTable,我在代码中给解释具体的功能的内容和为什么:   
        
        
      //引入oracle和db2的连接及需要移植的表   
      public   static   void   MigrateTable(Connection   connOra,   Connection   connDB2,   String   strTableName)   
      throws   Exception   
      {   
      //进行防错处理   
      if   (strTableName.length()   <3)   
      return;   
        
      int   nRows   =   0;   
        
      FileWriter   fw   =   null;   
      PrintWriter   pw   =   null;   
      Statement   stmt   =   null;   
      ResultSet   rst   =   null;   
      Statement   stmtDelete   =   null;   
      PreparedStatement   stmtUp   =   null;   
        
      try   
      {   
                //记录转换过程中的信息   
      fw   =   new   FileWriter("OracleToDb2.log",   true);   
      pw   =   new   PrintWriter(fw);   
        
      System.out.println("migrating   table   "   +   strTableName);   
      pw.println("migrating   table   "   +   strTableName);   
                    //确定连接赋予SQL语句   
      stmt   =   connOra.createStatement();   
                  //进行表内容的查询   
      rst   =   stmt.executeQuery("select   *   from   "   +   strTableName);   
          //读入表的元数据   
      ResultSetMetaData   meta   =   rst.getMetaData();   
      String   strSql   =   "insert   into   "   +   strTableName;   
      String   strFields   =   "(";   
      String   strValues   =   "     values(";   
          //根据读入的表的元数据的内容进行递归的读取   
      Object   arObjData[]   =   new   Object[meta.getColumnCount()];   
        
      for   (int   i   =   0;   i   <   arObjData.length;   i   ++)   
      {   
      if   (i   >   0)   
      {   
      strValues   =   strValues   +   ",   ";   
      strFields   =   strFields   +   ",   ";   
      }   
        
      strValues   =   strValues   +   "?";   
      strFields   =   strFields   +   meta.getColumnName(i   +   1);   
      }   
        
      strValues   =   strValues   +   ")";   
      strFields   =   strFields   +   ")";   
      strSql   =   strSql   +   strFields   +   strValues;   
                //建立DB2数据库的连接   
      stmtDelete   =   connDB2.createStatement();   
                        //删除原DB2数据库表中的数据   
      stmtDelete.executeUpdate("delete   from   "   +     strTableName);   
      stmtDelete.close();   
      stmtUp   =   connDB2.prepareStatement(strSql);   
        
      while   (rst.next())   
      {     
      for   (int   i   =   0;   i     
      上面的代码示整个转换器的关键部分,它实现了整个移植过程的大部分功能而且可以实现代码页,二进制的数据的移植是一个功能强大的移植工具。下面我就运行的步骤作详细的演示:   
        
      在操作系统上的类路径中加入jdk的路径。   
      配置属性文件。   
      把oracle数据库中的表结构倒成.ddl文件,并调整其中的数据类型映射为DB2中的类型建立表。   
      编译整个Java文件   
      执行   
      查看日志信息   
        
      下面是整个程序的完整代码:   
      import   java.text.*;   
      import   java.util.*;   
      import   java.io.*;   
      import   java.sql.*;   
      import   java.lang.*;   
      public   class   OracleToDb2   
      {   
      public   static   void   main(String[]   args)   
      throws   Exception   
      {               
      //下面的代码是读属性文件的信息   
      Properties   props=new   Properties();   
      File   f=new   File("OracleToDb2.properties");   
                      FileInputStream   in=new   FileInputStream(f);   
                      props.load(in);   
                      String   db2_dbname=props.getProperty("db2_dbname");   
                      String   db2_username=props.getProperty("db2_username");   
                      String   db2_password=props.getProperty("db2_password");   
                      String   oracle_url=props.getProperty("oracle_url");   
                      String   oracle_dbname=props.getProperty("oracle_dbname");   
                      String   oracle_username=props.getProperty("oracle_username");   
                      String   oracle_password=props.getProperty("oracle_password");   
                      String   io_tables=props.getProperty("io_tables");   
                      //建立DB2和ORACLE数据库的分别连接   
                      //   String   db2_url   =   "jdbc:db2://"+db2_host+":"+db2_port+"/"+db2_dbname;   
      DriverManager.registerDriver(new   COM.ibm.db2.jdbc.app.DB2Driver());   
      //DriverManager.registerDriver(new   COM.ibm.db2.jdbc.net.DB2Driver());   
      Class.forName   ("oracle.jdbc.driver.OracleDriver").newInstance   ();   
      Connection   connOra   =   DriverManager.getConnection("jdbc:db2:"+db2_dbname,     db2_username,db2_password);     
      //Connection   connOra   =   DriverManager.getConnection("   
      jdbc:db2://"+db2_host+":"+db2_port+"/"+db2_dbname,     db2_username,db2_password);     
        
      Connection   connDB2   =   DriverManager.getConnection("   
      jdbc:oracle:thin:@"+oracle_url+":1521:"+oracle_dbname,oracle_username,   oracle_password);   
        
      FileReader   reader   =   new   FileReader(io_tables);   
      LineNumberReader   lreader   =   new   LineNumberReader(reader);   
        
      String   strTable   =   null;   
        
      while   ((strTable   =   lreader.readLine())   !=   null)   
      {   
      try   
      {   
      MigrateTable(connOra,   connDB2,   strTable);   
      }   
      catch   (Exception   e)   
      {   
      e.printStackTrace();   
      }   
      }   
        
      reader.close();   
        
      connOra.close();   
      connDB2.close();   
        
      System.out.println("ok");   
      }   
        
      public   static   void   MigrateTable(Connection   connOra,   Connection   connDB2,   String   strTableName)   
      throws   Exception   
      {   
      if   (strTableName.length()   <3)   
      return;   
      int   nRows   =   0;   
        
      FileWriter   fw   =   null;   
      PrintWriter   pw   =   null;   
      Statement   stmt   =   null;   
      ResultSet   rst   =   null;   
      Statement   stmtDelete   =   null;   
      PreparedStatement   stmtUp   =   null;   
        
      try   
      {   
      fw   =   new   FileWriter("OracleToDb2.log",   true);   
      pw   =   new   PrintWriter(fw);   
        
      System.out.println("migrating   table   "   +   strTableName);   
      pw.println("migrating   table   "   +   strTableName);   
        
      stmt   =   connOra.createStatement();   
      rst   =   stmt.executeQuery("select   *   from   "   +   strTableName);   
        
      ResultSetMetaData   meta   =   rst.getMetaData();   
        
      String   strSql   =   "insert   into   "   +   strTableName;   
      String   strFields   =   "(";   
      String   strValues   =   "     values(";   
        
      Object   arObjData[]   =   new   Object[meta.getColumnCount()];   
        
      for   (int   i   =   0;   i   <   arObjData.length;   i   ++)   
      {   
      if   (i   >   0)   
      {   
      strValues   =   strValues   +   ",   ";   
      strFields   =   strFields   +   ",   ";   
      }   
        
      strValues   =   strValues   +   "?";   
      st
      

  8.   

    Oracle到DB2的流程:   
        
      把Oracle的数据移植到DB2数据库中我们的Java程序起到一个转换器的作用,把Oracle中的不同的数据类型映射为相应的DB2数据库中的类型同时把从Oracle中查询出的数据插入到DB2数据库中从而完成整个移植过程。下面我就结合Java程序给大家是如何实现这一功能的     
        
      1.导入必需的java类     
        
        
      import   java.text.*;   
      import   java.util.*;   
      import   java.io.*;   
      import   java.sql.*;   
      import   java.lang.*;   
        
        
      2.下面是从属性文件中读取在转换器使用的配置信息     
        
        
      //下面的代码是读属性文件的信息   
      Properties   props=new   Properties();   
      File   f=new   File("OracleToDb2.properties");   
      FileInputStream   in=new   FileInputStream(f);   
      props.load(in);   
      String   db2_dbname=props.getProperty("db2_dbname");   
      String   db2_username=props.getProperty("db2_username");   
      String   db2_password=props.getProperty("db2_password");   
      String   oracle_url=props.getProperty("oracle_url");   
      String   oracle_dbname=props.getProperty("oracle_dbname");   
      String   oracle_username=props.getProperty("oracle_username");   
      String   oracle_password=props.getProperty("oracle_password");   
      String   io_tables=props.getProperty("io_tables");   
        
      通过java的输入流来读取文件中的内容   
      其中   
        
      OracleToDb2.properties为属性文件名;     
      db2_dbname,   db2_username,   db2_password   分别为目标DB2数据库的数据库名,数据库用户名,口令。     
      oracle_url   ,oracle_dbname,oracle_username,oracle_password分别为oracle数据库的地址,数据库名,用户名,口令。     
      io_tables为从Oracle移植到DB2的表名   
      下面是属性文件的全部内容:     
      db2_dbname=db2DatabaseName   
      db2_username=db2UserName   
      db2_password=db2Password   
      db2_host=127.0.0.1   
      oracle_url=127.0.0.1   
      oracle_dbname=oracleDatabaseName   
      oracle_username=oracleUsername   
      oracle_password=oraclePassword   
      io_tables=io_tables   
        
        
      3.接着分别建立DB2和ORACLE数据库的连接     
      其中的参数为从属性文件中读入的值,jdbc用的是廋客户机的type4:   
        
        
      DriverManager.registerDriver(new   COM.ibm.db2.jdbc.app.DB2Driver());   
      Class.forName   ("oracle.jdbc.driver.OracleDriver").newInstance   ();   
      Connection   connOra   =   DriverManager.getConnection("jdbc:db2:"+db2_dbname,     db2_username,db2_password);     
      //Connection   connOra   =   DriverManager.getConnection("jdbc:db2://"+db2_host+":"+db2_port+"/"+db2_dbname,     db2_username,db2_password);     
      Connection   connDB2   =DriverManager.getConnection("jdbc:oracle:thin:@"+oracle_url+":1521:"+oracle_dbname,oracle_username,   oracle_password);   
        
      4.转换器的核心java类     
      转换器的核心java类的方法为一个静态的java方法MigrateTable,我在代码中给解释具体的功能的内容和为什么:   
        
        
      //引入oracle和db2的连接及需要移植的表   
      public   static   void   MigrateTable(Connection   connOra,   Connection   connDB2,   String   strTableName)   
      throws   Exception   
      {   
      //进行防错处理   
      if   (strTableName.length()   <3)   
      return;   
        
      int   nRows   =   0;   
        
      FileWriter   fw   =   null;   
      PrintWriter   pw   =   null;   
      Statement   stmt   =   null;   
      ResultSet   rst   =   null;   
      Statement   stmtDelete   =   null;   
      PreparedStatement   stmtUp   =   null;   
        
      try   
      {   
                //记录转换过程中的信息   
      fw   =   new   FileWriter("OracleToDb2.log",   true);   
      pw   =   new   PrintWriter(fw);   
        
      System.out.println("migrating   table   "   +   strTableName);   
      pw.println("migrating   table   "   +   strTableName);   
                    //确定连接赋予SQL语句   
      stmt   =   connOra.createStatement();   
                  //进行表内容的查询   
      rst   =   stmt.executeQuery("select   *   from   "   +   strTableName);   
          //读入表的元数据   
      ResultSetMetaData   meta   =   rst.getMetaData();   
      String   strSql   =   "insert   into   "   +   strTableName;   
      String   strFields   =   "(";   
      String   strValues   =   "     values(";   
          //根据读入的表的元数据的内容进行递归的读取   
      Object   arObjData[]   =   new   Object[meta.getColumnCount()];   
        
      for   (int   i   =   0;   i   <   arObjData.length;   i   ++)   
      {   
      if   (i   >   0)   
      {   
      strValues   =   strValues   +   ",   ";   
      strFields   =   strFields   +   ",   ";   
      }   
        
      strValues   =   strValues   +   "?";   
      strFields   =   strFields   +   meta.getColumnName(i   +   1);   
      }   
        
      strValues   =   strValues   +   ")";   
      strFields   =   strFields   +   ")";   
      strSql   =   strSql   +   strFields   +   strValues;   
                //建立DB2数据库的连接   
      stmtDelete   =   connDB2.createStatement();   
                        //删除原DB2数据库表中的数据   
      stmtDelete.executeUpdate("delete   from   "   +     strTableName);   
      stmtDelete.close();   
      stmtUp   =   connDB2.prepareStatement(strSql);   
        
      while   (rst.next())   
      {     
      for   (int   i   =   0;   i     
      上面的代码示整个转换器的关键部分,它实现了整个移植过程的大部分功能而且可以实现代码页,二进制的数据的移植是一个功能强大的移植工具。下面我就运行的步骤作详细的演示:   
        
      在操作系统上的类路径中加入jdk的路径。   
      配置属性文件。   
      把oracle数据库中的表结构倒成.ddl文件,并调整其中的数据类型映射为DB2中的类型建立表。   
      编译整个Java文件   
      执行   
      查看日志信息   
        
      下面是整个程序的完整代码:   
      import   java.text.*;   
      import   java.util.*;   
      import   java.io.*;   
      import   java.sql.*;   
      import   java.lang.*;   
      public   class   OracleToDb2   
      {   
      public   static   void   main(String[]   args)   
      throws   Exception   
      {               
      //下面的代码是读属性文件的信息   
      Properties   props=new   Properties();   
      File   f=new   File("OracleToDb2.properties");   
                      FileInputStream   in=new   FileInputStream(f);   
                      props.load(in);   
                      String   db2_dbname=props.getProperty("db2_dbname");   
                      String   db2_username=props.getProperty("db2_username");   
                      String   db2_password=props.getProperty("db2_password");   
                      String   oracle_url=props.getProperty("oracle_url");   
                      String   oracle_dbname=props.getProperty("oracle_dbname");   
                      String   oracle_username=props.getProperty("oracle_username");   
                      String   oracle_password=props.getProperty("oracle_password");   
                      String   io_tables=props.getProperty("io_tables");   
                      //建立DB2和ORACLE数据库的分别连接   
                      //   String   db2_url   =   "jdbc:db2://"+db2_host+":"+db2_port+"/"+db2_dbname;   
      DriverManager.registerDriver(new   COM.ibm.db2.jdbc.app.DB2Driver());   
      //DriverManager.registerDriver(new   COM.ibm.db2.jdbc.net.DB2Driver());   
      Class.forName   ("oracle.jdbc.driver.OracleDriver").newInstance   ();   
      Connection   connOra   =   DriverManager.getConnection("jdbc:db2:"+db2_dbname,     db2_username,db2_password);     
      //Connection   connOra   =   DriverManager.getConnection("   
      jdbc:db2://"+db2_host+":"+db2_port+"/"+db2_dbname,     db2_username,db2_password);     
        
      Connection   connDB2   =   DriverManager.getConnection("   
      jdbc:oracle:thin:@"+oracle_url+":1521:"+oracle_dbname,oracle_username,   oracle_password);   
        
      FileReader   reader   =   new   FileReader(io_tables);   
      LineNumberReader   lreader   =   new   LineNumberReader(reader);   
        
      String   strTable   =   null;   
        
      while   ((strTable   =   lreader.readLine())   !=   null)   
      {   
      try   
      {   
      MigrateTable(connOra,   connDB2,   strTable);   
      }   
      catch   (Exception   e)   
      {   
      e.printStackTrace();   
      }   
      }   
        
      reader.close();   
        
      connOra.close();   
      connDB2.close();   
        
      System.out.println("ok");   
      }   
        
      public   static   void   MigrateTable(Connection   connOra,   Connection   connDB2,   String   strTableName)   
      throws   Exception   
      {   
      if   (strTableName.length()   <3)   
      return;   
      int   nRows   =   0;   
        
      FileWriter   fw   =   null;   
      PrintWriter   pw   =   null;   
      Statement   stmt   =   null;   
      ResultSet   rst   =   null;   
      Statement   stmtDelete   =   null;   
      PreparedStatement   stmtUp   =   null;   
        
      try   
      {   
      fw   =   new   FileWriter("OracleToDb2.log",   true);   
      pw   =   new   PrintWriter(fw);   
        
      System.out.println("migrating   table   "   +   strTableName);   
      pw.println("migrating   table   "   +   strTableName);   
        
      stmt   =   connOra.createStatement();   
      rst   =   stmt.executeQuery("select   *   from   "   +   strTableName);   
        
      ResultSetMetaData   meta   =   rst.getMetaData();   
        
      String   strSql   =   "insert   into   "   +   strTableName;   
      String   strFields   =   "(";   
      String   strValues   =   "     values(";   
        
      Object   arObjData[]   =   new   Object[meta.getColumnCount()];   
        
      for   (int   i   =   0;   i   <   arObjData.length;   i   ++)   
      {   
      if   (i   >   0)   
      {   
      strValues   =   strValues   +   ",   ";   
      strFields   =   strFields   +   ",   ";   
      }   
        
      strValues   =   strValues   +   "?";   
      st