成都网站建设设计

将想法与焦点和您一起共享

db2怎么转oracle,db2转换函数

db2迁移到oracle有哪几种方式

在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和执行绑定包

如何把 DB2 数据迁移到 oracle 中

数据迁移:

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+"秒");

}

}

}

怎么把db2的数据导入到oracle中 iteye

这个比较好办。

建立一个 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到Oracle的SQL转换

本篇记录项目中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://chengdu.cdxwcx.cn/article/hspecp.html