Oracle中得blob字段导入到DB2的Blob字段

1.背景

在项目中使用blob大字段来存储报文,最近有客户需要使用DB2数据库来部署应用,所有只得把oracle中初始化脚本导入到DB2中,在制作DB2的初始化脚本

2.问题

怎么样把oracle中得含blob字段的表导入到DB2中呢,在网上转了一下没有发现,决定写程序解决

3.解决问题

使用JDBC连接先查出oracle中得表,然后插入到DB2中。先新建java project,然后添加oracle和DB2的驱动包,如下图:


DB2ConnectionFactory源码为:

package com.ylink.export;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DB2ConnectionFactory {

		

		final static String DRIVER = "com.ibm.db2.jcc.DB2Driver";
		final static String CONSTR = "jdbc:db2://172.168.6.212:50000/tps";
		final static String USERNAME = "db2admin";
		final static String USERPASS = "db2admin";
		
		/**
		 * 获得数据库连接
		 * @return
		 */
		public static Connection getConnection(){
			Connection con = null;
		
			try {
				
				Class.forName(DRIVER);
				con = DriverManager.getConnection(CONSTR,USERNAME,USERPASS);
				con.setAutoCommit(false);  //设置不自动提交事务
				
			}catch (SQLException e) {
				System.out.println("sql语句错误"+e.getMessage());
			} catch (ClassNotFoundException e) {
				System.out.println(e.getMessage());
			}
			
			return con;
		}
	}
IOperationCore接口源码为:
/**
 * 数据库常用操作封装
 */
package com.ylink.export;

import java.lang.reflect.InvocationTargetException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/** 类名:IOperationCore<br>
 * 
 * 作用: 该接口封装了数据库操作的大部分方法<br>
 * 
 */
public interface IOperationCore {
   /** sql更新语句
    * 
    * @param queryString 查询语句
    * @return 返回一个<code>ResultSet</code>结果集
    * 
    * @exception SQLException */
   ResultSet executeQuery(String queryString) throws SQLException;
   /**  
    * sql更新语句
    * 
    * @param updateString 数据库更新语句
    * @return 更新数据库影响行数
    * 
    * @exception SQLException */
   int executeUpdate(String updateString) throws SQLException;
   
   
   @SuppressWarnings("unchecked")
	public <T> List<T> queryForList(String sql, Class<T> clazz,
			Object... params)throws SQLException, InstantiationException,
			IllegalAccessException, InvocationTargetException,
			ClassNotFoundException;
  
   /** 
    * 释放系统连接资源
    * 
    * @exception SQLException 如果关闭失败将抛出<code>SQLException</code>*/
   void dispose() throws SQLException;

}

OperationCoreImpl源码为:

package com.ylink.export;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
 * 类名:OperationCoreImplements<br>
 * 
 * 作用: 该类实现IOperationCore接口的所有方法<br>
 */
public class OperationCoreImpl implements IOperationCore {
	protected Connection aConnection = null;
	protected Statement ps = null;
	protected ResultSet rs = null;
	protected ResultSetMetaData rsmd = null;
	protected static OperationCoreImpl m_instance = null;

	/**
	 * Singleton 即单例(态)模式,用来生成对象唯一实例的方法
	 * 
	 * @return OperationCoreImplements的一个实例
	 * @throws Exception
	 */
	public static OperationCoreImpl createFactory() throws Exception {
		if (m_instance == null)
			m_instance = new OperationCoreImpl();
		return m_instance;
	}

	/** @exception Exception */
	public OperationCoreImpl() throws Exception {
		init();
	}

	private void init() throws Exception {
		aConnection = OracleConnectionFactory.getConnection();
	}

	/**
	 * 释放系统连接资源
	 */
	public void dispose() {
		try {
			if (rs != null)
				rs.close();
		} catch (SQLException e) {

			e.printStackTrace();
		}
		try {
			if (ps != null)
				ps.close();
		} catch (SQLException e) {

			e.printStackTrace();
		}
		try {
			if (aConnection != null)
				aConnection.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}

	}

	/**
	 * 返回ResultSet对象
	 * 
	 * @param queryString
	 *            查询语句
	 * @return 返回一个<code>ResultSet</code>结果集
	 * 
	 * @exception SQLException
	 */
	public ResultSet executeQuery(String queryString) {
		try {
			ps = aConnection.createStatement();
			rs = ps.executeQuery(queryString);
		} catch (SQLException e) {
			rs = null;
			e.printStackTrace();
		}
		return rs;
	}

	//返回list通用   JDBC直连
	@SuppressWarnings("unchecked")
	public <T> List<T> queryForList(String sql, Class<T> clazz,
			Object... params) throws SQLException, InstantiationException,
			IllegalAccessException, InvocationTargetException,
			ClassNotFoundException {

		if (clazz == null) {
			throw new IllegalArgumentException("clazz is null");
		}

		ResultSet rs = null;
		PreparedStatement ps = null;

		try {
			List<T> resultList = new ArrayList<T>();

			ps = aConnection.prepareStatement(sql);
			if (params != null) {
				for (int i = 0; i < params.length; i++) {
					ps.setObject(i + 1, params[i]);
				}
			}

			rs = ps.executeQuery();
			T t = null;
			Method[] allMethod = clazz.getMethods();
			List<Method> setterMethodList = new ArrayList<Method>();
			for (Method m : allMethod) {
				if (m.getName().startsWith("set")) {
					setterMethodList.add(m);
				}
			}

			String columnName = null;
			Class parameterType = null;
			if (rs != null) {
				while (rs.next()) {
					t = clazz.newInstance();
					for (Method m : setterMethodList) {
						columnName = m.getName().substring(3, 4).toLowerCase()
								+ m.getName()
										.substring(4, m.getName().length());

						parameterType = m.getParameterTypes()[0];

						if (parameterType.isPrimitive()) {
							if (parameterType == Boolean.TYPE) {
								m.invoke(t, rs.getBoolean(columnName));
							} else if (parameterType == Byte.TYPE) {
								m.invoke(t, rs.getByte(columnName));
							} else if (parameterType == Short.TYPE) {
								m.invoke(t, rs.getShort(columnName));
							} else if (parameterType == Character.TYPE) {
								m.invoke(t, rs.getString(columnName).charAt(0));
							} else if (parameterType == Integer.TYPE) {
								m.invoke(t, rs.getInt(columnName));
							} else if (parameterType == Long.TYPE) {
								m.invoke(t, rs.getLong(columnName));
							} else if (parameterType == Float.TYPE) {
								m.invoke(t, rs.getFloat(columnName));
							} else if (parameterType == Double.TYPE) {
								m.invoke(t, rs.getDouble(columnName));
							}

						} else {
							m.invoke(t, rs.getObject(columnName));
						}
					}

					resultList.add(t);
				}
			}

			return resultList;

		} finally {
			dispose();
		}
	}

	/**
	 * 增、删、改操作
	 * 
	 * @param updateString
	 *            数据库更新语句
	 * @return 更新数据库影响行数
	 * 
	 * @exception SQLException
	 */
	public int executeUpdate(String updateString) {
		int effectedRows = 0;
		try {
			aConnection.setAutoCommit(false);
			ps = aConnection.createStatement();
			effectedRows = ps.executeUpdate(updateString);
			aConnection.commit();
		} catch (SQLException ex) {
			System.out.println("数据库写操作失败!");
			if (aConnection != null) {
				try {
					aConnection.rollback();
					System.out.println("JDBC事务回滚成功");
				} catch (SQLException e) {
					System.out.println("JDBC事务回滚失败");
					e.printStackTrace();
				}
			}
		}
		return effectedRows;
	}
}


OracleConnectionFactory源码为:

package com.ylink.export;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class OracleConnectionFactory {

	

	final static String DRIVER = "oracle.jdbc.driver.OracleDriver";
	final static String CONSTR = "jdbc:oracle:thin:@172.168.9.70:1521:tps";
	final static String USERNAME = "tps";
	final static String USERPASS = "tps";
	
	/**
	 * 获得数据库连接
	 * @return
	 */
	public static  Connection getConnection(){
		Connection con = null;
	
		try {
			
			Class.forName(DRIVER);
			con = DriverManager.getConnection(CONSTR,USERNAME,USERPASS);
			con.setAutoCommit(false);  //设置不自动提交事务
			
		}catch (SQLException e) {
			System.out.println("sql语句错误"+e.getMessage());
		} catch (ClassNotFoundException e) {
			System.out.println(e.getMessage());
		}
		
		return con;
	}
}

运行export即可把oracle的表中数据导入到DB2中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要更新 Oracle 数据库中的 BLOB 字段,你可以使用以下步骤: 1. 首先,创建一个包含 BLOB 字段数据表或在已有的表中添加 BLOB 字段。 ```sql CREATE TABLE my_table ( id NUMBER, blob_column BLOB ); ``` 2. 使用 UPDATE 语句更新 BLOB 字段的值。你可以使用 PL/SQL 块或 SQL 语句执行此操作。 使用 PL/SQL 块的示例: ```sql DECLARE l_blob BLOB; BEGIN -- 从文件中读取新的 BLOB 数据 SELECT empty_blob() INTO l_blob FROM dual; INSERT INTO my_table (id, blob_column) VALUES (1, l_blob); -- 打开 BLOB 对象以进行写入操作 DBMS_LOB.OPEN(l_blob, DBMS_LOB.LOB_READWRITE); -- 写入新的 BLOB 数据 DBMS_LOB.WRITE(l_blob, LENGTHB('New BLOB data'), 1, 'New BLOB data'); -- 关闭 BLOB 对象 DBMS_LOB.CLOSE(l_blob); -- 更新表中的记录 UPDATE my_table SET blob_column = l_blob WHERE id = 1; COMMIT; END; / ``` 使用 SQL 语句的示例: ```sql UPDATE my_table SET blob_column = ( SELECT empty_blob() FROM dual ) WHERE id = 1; DECLARE l_blob BLOB; BEGIN SELECT blob_column INTO l_blob FROM my_table WHERE id = 1 FOR UPDATE; -- 打开 BLOB 对象以进行写入操作 DBMS_LOB.OPEN(l_blob, DBMS_LOB.LOB_READWRITE); -- 写入新的 BLOB 数据 DBMS_LOB.WRITE(l_blob, LENGTHB('New BLOB data'), 1, 'New BLOB data'); -- 关闭 BLOB 对象 DBMS_LOB.CLOSE(l_blob); COMMIT; END; / ``` 请注意,这只是一个简单的示例,实际情况可能更复杂。你可能需要根据你的具体需求进行相应的调整。同时,确保在操作 BLOB 字段时进行适当的事务管理和异常处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值