在oracle中,建立透明網關,連接到db2數據庫中.
10年積累的成都做網站、網站設計、外貿營銷網站建設經驗,可以快速應對客戶對網站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網絡服務。我雖然不認識你,你也不認識我。但先網站設計后付款的網站建設流程,更有永康免費網站建設讓你可以放心的選擇與我們合作。
大概過程如下:
1、先安裝對應的透明網關組件
2、initudb.ora--inittest.ora,主要修改下面幾個參數
DRDA_CONNECT_PARM=db2數據庫ip:端口
DRDA_REMOTE_DB_NAME=test
HS_DB_NAME=test
3、listener.ora文件增加
(SID_DESC=
(SID_NAME=test)
(ORACLE_HOME = 設置為$ORACLE_HOME)
(PROGRAM=g4drsrv)
)
4、tnsnames.ora
gatewaydb2=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle數據庫主機ip)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = test)
)
(HS = OK)
)
5、創建dblink和執行綁定包
數據遷移:
1、在DB2數據庫中通過以下表查詢出表的結構
SELECT
TABNAME TAB, --表英文名稱
COLNAME COL, --列名稱
CASE
WHEN TYPENAME='VARCHAR' THEN 'VARCHAR2'
WHEN TYPENAME LIKE 'SMALLINT' OR TYPENAME LIKE 'BIGINT' THEN 'INTEGER'
WHEN TYPENAME ='CHARACTER' THEN 'CHAR'
WHEN TYPENAME='DECFLOAT' OR TYPENAME ='DECIMAL' THEN 'NUMBER'
ELSE TYPENAME
END TY
, --數據類型
LENGTH LEN , --列長度
scale S, --精度
CASE
WHEN NULLS='N' THEN '否'
WHEN NULLS='Y' THEN '是'
END N --是否為空
--TY||'('||LEN||')'
FROM
SYSCAT.COLUMNS S
WHERE
LEFT( TABSCHEMA, 3 ) 'SYS'
/* and s.SCALE 0*/
ORDER BY
S.TABNAME,
S.COLNO
2、根據表的結構在oracle數據庫中建表(腳本見《create_tab_onOracle.sql》)
3、通過編寫java程序把數據從DB2導入到oracle數據庫中(以下代碼思想僅供參考)
3.1、 導入db2jcc_license_cu.jar 、db2jcc.jar 、ojdbc14.jar 三個jar包即可
3.2、 編寫三個工具類
此類鏈接DB2數據庫工具類
package com.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class ConnectionDB2 {
private static final String URL="jdbc:db2://192.168.0.98:50000/sem"; //DB2數據庫url
private static final String USER="db2admin"; //DB2數據庫賬號
private static final String PASSWORD="dnhc9988"; //DB2數據庫密碼
static{
try {
Class.forName("com.ibm.db2.jcc.DB2Driver").newInstance(); //利用反射注冊驅動
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public Connection getConnection(){
Connection conn=null;
try {
conn=DriverManager.getConnection(URL, USER, PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
}
此類鏈接oracle數據庫工具類
package com.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class ConnectionDB2 {
private static final String URL="jdbc:db2://192.168.0.98:50000/sem"; //DB2數據庫url
private static final String USER="db2admin"; //DB2數據庫賬號
private static final String PASSWORD="dnhc9988"; //DB2數據庫密碼
static{
try {
Class.forName("com.ibm.db2.jcc.DB2Driver").newInstance(); //利用反射注冊驅動
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public Connection getConnection(){
Connection conn=null;
try {
conn=DriverManager.getConnection(URL, USER, PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
}
此類用來關閉數據庫連接工具類
package com.util;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class CloseFunction {
//關閉連接方法,釋放資源
public static void closeConnection(Connection conn){
if (conn !=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//關閉執行sql,釋放資源
public static void closeExecuteSQL(Statement preparedStatement){
if (preparedStatement !=null){
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//關閉查詢SQL結果,釋放資源
public static void closeResultSet(ResultSet resultSet){
if(resultSet !=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
關鍵在此類:需要從DB2數據庫查詢語句放在db2SQL變量中,往oracle插入數據的語句放在oracleSQL變量中。注意,查詢和插入的語句中字段順序要一致,在while循環里要對日期時間處理(用setDate),然后執行junit測試類就可以了。
package com.dao;
import java.security.interfaces.RSAKey;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.junit.Test;
import com.util.CloseFunction;
import com.util.ConnectionDB2;
import com.util.ConnectionOracle;
public class FromDB2ToOracle {
@Test
public void test1() throws SQLException{
long startTime=System.currentTimeMillis(); //記錄開始時間
Connection connDB2=null; //鏈接DB2數據庫
Connection connOracle=null; //鏈接oracle數據庫
Statement statement=null;
ResultSet resultSet=null;
PreparedStatement preparedStatement=null;
try {
ConnectionOracle connectionOracle=new ConnectionOracle();
// System.out.println(connectionOracle+"鏈接oracle成功!");
ConnectionDB2 connectionDB2=new ConnectionDB2();
// System.out.println(connectionDB2+"--鏈接DB2數據庫成功!");
connDB2=connectionDB2.getConnection();
//執行DB2數據庫sql語句,此處并非固定代碼
String
db2SQL="SELECT ID,SENDNO,SENDTYPE,BRNUMBER
,SENDTIME,ALARMTIME,SENDCONTENT,ISSEND ,ELEALARMID from
DB2ADMIN.ET_SENDMESSAGEINFO";
//執行oracle數據庫sql語句,此處并非固定代碼
//String oracleSQL="INSERT INTO EPC.SYS_LOG(ID,REMARK) values(?,?)";
String
oracleSQL="INSERT INTO
EPC.ET_SENDMESSAGEINFO(ID,SENDNO,SENDTYPE,BRNUMBER
,SENDTIME,ALARMTIME,SENDCONTENT,ISSEND ,ELEALARMID )"
+ "VALUES(?,?,?,?,?,?,?,?,?)";
statement=connDB2.createStatement();
statement.execute(db2SQL); //執行sql語句
resultSet=statement.getResultSet(); //獲取DB2數據庫的結果集
connOracle=connectionOracle.getConnection(); //獲取oracle數據庫連接
connOracle.setAutoCommit(false); //把oracle數據庫設置為非自動提交,以免在再循環里每次都提交,減低效率
preparedStatement=connOracle.prepareStatement(oracleSQL); //執行oracle語句,預編譯
int num=0;
while (resultSet.next()) {
num ++;
preparedStatement.setString(1,resultSet.getString("ID"));
preparedStatement.setString(2, resultSet.getString("SENDNO"));
preparedStatement.setString(3, resultSet.getString("SENDTYPE"));
preparedStatement.setString(4, resultSet.getString("BRNUMBER"));
preparedStatement.setDate(5, resultSet.getDate("SENDTIME"));
preparedStatement.setDate(6, resultSet.getDate("ALARMTIME"));
preparedStatement.setString(7, resultSet.getString("SENDCONTENT"));
preparedStatement.setString(8, resultSet.getString("ISSEND"));
preparedStatement.setString(9, resultSet.getString("ELEALARMID"));/*
preparedStatement.setString(10, resultSet.getString("CONSUMETIME"));
preparedStatement.setString(11, resultSet.getString("TASKID"));
preparedStatement.setString(12, resultSet.getString("ISSYNCHRO"));
preparedStatement.setString(13,resultSet.getString("LOGTYPE"));
preparedStatement.setString(14, resultSet.getString("ISCACHE"));
preparedStatement.setString(15, resultSet.getString("LAST_RPORT_TIME"));
preparedStatement.setString(16, resultSet.getString("AUTO_REMEMBER"));
preparedStatement.setString(17, resultSet.getString("REMARK"));*/
preparedStatement.addBatch();
//每一萬次在oracle數據庫里提交事務
if(num10000){
preparedStatement.executeBatch();
connOracle.commit();
num=0;
}
}
preparedStatement.executeBatch();
connOracle.commit();
} catch (Exception e) {
connOracle.rollback(); //oracle數據庫事務回滾
e.printStackTrace();
}finally{
new CloseFunction().closeConnection(connOracle); //關閉oracle數據庫,釋放資源
new CloseFunction().closeConnection(connDB2); //關閉DB2數據庫,釋放資源
long endTime=System.currentTimeMillis(); //記錄程序結束時間
System.out.println("總的時間:"+(endTime-startTime)/1000+"秒");
}
}
}
這個比較好辦。
建立一個 exp的目錄 下面建立一個 log 的文件 來存放錯誤日志 等。
第一步 建立一個exp.bat 內容如下
db2 connect to test user db2inst1 using 123456 //假設數據庫為test 密碼為123456
db2 -td@ -f ./zx.sql log\zx.log
echo Over Over
第二步 在exp目錄下建立 zx.sql 內容如下
EXPORT TO
'ZX.TXT' OF DEL
MODIFIED BY COLDEL0X08 NOCHARDEL
SELECT "字段1", "字段2" , "字段3" ,''字段n" FROM "DB2INST1"."ZX" order by "ZXID"@
//這個sql是 導出假設 表名是 zx的表。
現在 db2的數據已經導出了。
然后你在建立一個 imp.bat 的文件,來把zx.txt 導入到 oracle,你需要建立 一個bad的目錄和ctl的目錄來存放oracle的ctl 文件.imp.bat 的內容如下
sqlldr scott/123@test control=ctl\zx.ctl log=log\zx-imp.log bad=bad\zx.bad
//假設用戶是 scott 數據的SID是 test
下面 來建立 oracle 控制文件 zx.ctl 的內容 需要把你從db2的導出文件 zx.txt 導入到oracle
load data
infile 'zx.txt'
append into table zx
fields terminated by '^H '
本篇記錄項目中DB2的SQL轉為Oracle時的不同之處:
1、Oracle沒有DROP TABLE IF EXISTS
2、db2函數用returns [類型],Oracle用return [類型]
3、db2用DECLARE來申明變量,Oracle申明變量在as/is后面
4、db2用SET來賦值變量,Oracle用:=
5、db2用ELSEIF,oracle用ELSIF
6、Oracle中的coalesce函數(用來獲取第一個不為空的值)里面的數據類型,必須全部都跟第一列的
數據類型一致
7、Oracle函數最后要加個END [函數名]
8、DB2為sysibm.dual,Oracle為dual
9、Oracle對象名不能超過30個字符
網站標題:db2怎么轉oracle,db2轉換函數
文章位置:http://vcdvsql.cn/article28/hspecp.html
成都網站建設公司_創新互聯,為您提供網站設計公司、動態網站、App設計、網站維護、響應式網站、品牌網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯