首先通過(guò)下面的圖來(lái)展示一下從Oracle到DB2的流程:

從上面的圖可以看到把Oracle的數據移植到DB2數據庫中我們的Java程序起到一個(gè)轉換器的作用,把Oracle中的不同的數據類(lèi)型映射為相應的DB2數據庫中的類(lèi)型同時(shí)把從Oracle中查詢(xún)出的數據插入到DB2數據庫中從而完成整個(gè)移植過(guò)程。下面我就結合Java程序給大家是如何實(shí)現這一功能的
import java.text.*; import java.util.*; import java.io.*; import java.sql.*; import java.lang.*; |
//下面的代碼是讀屬性文件的信息 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"); |
通過(guò)java的輸入流來(lái)讀取文件中的內容
其中
- OracleToDb2.properties為屬性文件名;
- db2_dbname, db2_username, db2_password 分別為目標DB2數據庫的數據庫名,數據庫用戶(hù)名,口令。
- oracle_url ,oracle_dbname,oracle_username,oracle_password分別為oracle數據庫的地址,數據庫名,用戶(hù)名,口令。
- io_tables為從Oracle移植到DB2的表名
下面是屬性文件的全部?jì)热荩?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
其中的參數為從屬性文件中讀入的值,jdbc用的是廋客戶(hù)機的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); |
轉換器的核心java類(lèi)的方法為一個(gè)靜態(tài)的java方法MigrateTable,我在代碼中給解釋具體的功能的內容和為什么:
//引入oracle和db2的連接及需要移植的表 public static void MigrateTable(Connection connOra, Connection connDB2, String strTableName) throws Exception { //進(jìn)行防錯處理 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 { //記錄轉換過(guò)程中的信息 fw = new FileWriter("OracleToDb2.log", true); pw = new PrintWriter(fw); System.out.println("migrating table " + strTableName); pw.println("migrating table " + strTableName); //確定連接賦予SQL語(yǔ)句 stmt = connOra.createStatement(); //進(jìn)行表內容的查詢(xún) rst = stmt.executeQuery("select * from " + strTableName); //讀入表的元數據 ResultSetMetaData meta = rst.getMetaData(); String strSql = "insert into " + strTableName; String strFields = "("; String strValues = " values("; //根據讀入的表的元數據的內容進(jìn)行遞歸的讀取 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 < arObjData.length; i ++) { arObjData[i] = rst.getObject(i + 1); //進(jìn)行二進(jìn)制、字符類(lèi)型的轉換 if (arObjData[i] != null && arObjData[i] instanceof String) arObjData[i] = (Object)ISO2GB((String)arObjData[i]); } for (int i = 0; i < arObjData.length; i ++) { if (meta.getColumnType(i + 1) == java.sql.Types.BLOB) { byte arData[] = null; if (arObjData[i] != null) arData = ((Blob)arObjData[i]).getBytes(1L, (int)((Blob)arObjData[i]).length()); //讀取二進(jìn)制的數據 stmtUp.setBytes(i + 1, arData); } else if (meta.getColumnType(i + 1) == java.sql.Types.CLOB) { String strData = null; if (arObjData[i] != null) strData = ((Clob)arObjData[i]).getSubString(1L, (int)((Clob)arObjData[i]).length()); stmtUp.setString(i + 1, ISO2GB(strData)); } else { if (arObjData[i] != null) stmtUp.setObject(i + 1, arObjData[i]); else stmtUp.setString(i + 1, null); } } stmtUp.executeUpdate(); //計數器表示一個(gè)表中移植了多少行 nRows ++; } |
上面的代碼示整個(gè)轉換器的關(guān)鍵部分,它實(shí)現了整個(gè)移植過(guò)程的大部分功能而且可以實(shí)現代碼頁(yè),二進(jìn)制的數據的移植是一個(gè)功能強大的移植工具。下面我就運行的步驟作詳細的演示:
- 在操作系統上的類(lèi)路徑中加入jdk的路徑。
- 配置屬性文件。
- 把oracle數據庫中的表結構倒成.ddl文件,并調整其中的數據類(lèi)型映射為DB2中的類(lèi)型建立表。
- 編譯整個(gè)Java文件
- 執行
- 查看日志信息
下面是整個(gè)程序的完整代碼:
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 + "?"; strFields = strFields + meta.getColumnName(i + 1); } strValues = strValues + ")"; strFields = strFields + ")"; strSql = strSql + strFields + strValues; stmtDelete = connDB2.createStatement(); stmtDelete.executeUpdate("delete from " + strTableName); stmtDelete.close(); stmtUp = connDB2.prepareStatement(strSql); while (rst.next()) { for (int i = 0; i < arObjData.length; i ++) { arObjData[i] = rst.getObject(i + 1); if (arObjData[i] != null && arObjData[i] instanceof String) arObjData[i] = (Object)ISO2GB((String)arObjData[i]); } for (int i = 0; i < arObjData.length; i ++) { if (meta.getColumnType(i + 1) == java.sql.Types.BLOB) { byte arData[] = null; if (arObjData[i] != null) arData = ((Blob)arObjData[i]).getBytes(1L, (int)((Blob)arObjData[i]).length()); stmtUp.setBytes(i + 1, arData); } else if (meta.getColumnType(i + 1) == java.sql.Types.CLOB) { String strData = null; if (arObjData[i] != null) strData = ((Clob)arObjData[i]).getSubString(1L, (int)((Clob)arObjData[i]).length()); stmtUp.setString(i + 1, ISO2GB(strData)); } else { if (arObjData[i] != null) stmtUp.setObject(i + 1, arObjData[i]); else stmtUp.setString(i + 1, null); } } stmtUp.executeUpdate(); nRows ++; } pw.println("" + nRows + " rows migrated"); System.out.println("" + nRows + " rows migrated"); } catch(Exception e) { if (pw != null) e.printStackTrace(pw); e.printStackTrace(); } finally { try { if (rst != null) rst.close(); } catch (Exception ee) { ee.printStackTrace(pw); } try { if (stmt != null) stmt.close(); } catch (Exception ee) { ee.printStackTrace(pw); } try { if (stmtDelete != null) stmtDelete.close(); } catch (Exception ee) { ee.printStackTrace(pw); } try { if (stmtUp != null) stmtUp.close(); } catch (Exception ee) { ee.printStackTrace(pw); } if (fw != null) { fw.flush(); fw.close(); } } } |

