package com.zhongbao.hlsafety.db;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.*;
public class SQLtoORA {
private Connection sqlcon;
private Connection oracon;
private String tableName;
private int countRecord; 
public SQLtoORA() {
setSQLDriver();
setORADriver();
}
public void setSQLDriver(){
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
String url = "jdbc:microsoft:sqlserver://192.168.0.11:1433;DatabaseName=hlsafety";
String user = "sa";
String pwd = "sa";
sqlcon = DriverManager.getConnection(url, user, pwd);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void setORADriver(){
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@192.168.0.3:1521:orcl";
String user = "hlsafety";
String pwd = "hlsafety";
oracon = DriverManager.getConnection(url, user, pwd);
oracon.setAutoCommit(false);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void returnCount(Connection con,String tableName){
ResultSet rs = null;
Statement stmt = null;
String sql = "select * from " + tableName;
try {
stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
rs = stmt.executeQuery(sql);
rs.last();
this.countRecord = rs.getRow();
rs.close();
stmt.close();
} catch (SQLException e) {
System.out.println("查询表失败:" + sql);
e.printStackTrace();
}
}
public ResultSet returnRS(Connection con,String tableName){
ResultSet rs = null;
Statement stmt = null;
String sql = "select * from " + tableName;
try {
stmt = con.createStatement();
rs = stmt.executeQuery(sql);
} catch (SQLException e) {
System.out.println("查询表失败:" + sql);
e.printStackTrace();
}
return rs;
}
public void conClose(){
try {
this.sqlcon.close();
this.oracon.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void setTableName(String tableName){
this.tableName = tableName;
}
public String removeComma(String insert){
int len = 0;
len = insert.length();
insert = insert.substring(0,len-1) + ")";
return insert;
}
public String removeSecond(String date){
int len = 0;
len = date.length();
date = date.substring(0,date.indexOf("."));
return date;
}
public static void main(String[] args) {
SQLtoORA my = new SQLtoORA();
my.setTableName("hlsafety_news");
ResultSet rs;//数据源结果集
ResultSet rsTarget;//目标库结果集
Statement stmt = null;
try {
stmt = my.oracon.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
} catch (SQLException e1) {
e1.printStackTrace();
}
rs = my.returnRS(my.sqlcon,my.tableName);
ResultSetMetaData rsmd;
String insert_sql = "insert into " + my.tableName + "(";
try {
rsmd = rs.getMetaData();

int columnCount = rsmd.getColumnCount();
for(int i = 1; i <= columnCount; i++){

insert_sql+=rsmd.getColumnName(i) + ",";
}
insert_sql = my.removeComma(insert_sql);

while(rs.next()){
String sql = "(";
String columnName = "";
String currentText = "";
System.out.println("当前执行:" + rs.getRow());
for(int i = 1; i <= columnCount; i++){
String currentValue=rs.getString(i);

//System.out.println(i + "当前值" +rsmd.getColumnName(i)+ "当前值类型" + rsmd.getColumnTypeName(i) + ":"+currentValue);
if(currentValue!=null){
if(rsmd.getColumnTypeName(i).equals("varchar")){
if(currentValue.equals("")){
sql += "NULL" + ",";
}else{
sql += "'" + currentValue+ "',";
}
}else if(rsmd.getColumnTypeName(i).equals("datetime")){
sql += "to_date('" + my.removeSecond(currentValue) + "','yyyy-MM-dd HH24:MI:SS'),";
}else if(rsmd.getColumnTypeName(i).equals("text")){
//oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob(i);
columnName = rsmd.getColumnName(i);
currentText = currentValue;
sql += "EMPTY_CLOB(),";
}else{
sql += currentValue+ ",";
}
}else{
sql += currentValue+ ",";
}
}

sql = my.removeComma(sql);
//System.out.println("*********************************");
//System.out.println(insert_sql + " values" + sql);
stmt.executeUpdate(insert_sql + " values" + sql);
rsTarget = stmt.executeQuery("SELECT " + columnName + " FROM " + my.tableName + " for update");
while (rsTarget.next()) {
                /* 取出此CLOB对象 */
                oracle.sql.CLOB clob = (oracle.sql.CLOB)rsTarget.getClob(columnName);
                /* 向CLOB对象中写入数据 */
                BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());
                try {
out.append(currentText);
out.close();
out=null;
} catch (IOException e) {
e.printStackTrace();
}
            }
//System.out.println("长度" + currentText.length());
rsTarget.close();
}
my.oracon.commit();
} catch (SQLException e) {
try {
my.oracon.rollback();
} catch (SQLException e1) {
System.out.println("回滚失败");
e1.printStackTrace();
}
e.printStackTrace();
}
my.conClose();
}}
目的:从SQLSERVER数据库向ORACLE数据库导表,因为SQLSERVER的TEXT类型的字段要与ORACLE的CLOB相转换,
问题:插入一条记录好使,但是如果源结果集大于一条记录以后,插入到目地表里的所有记录的CLOB类型的字段里的内容都是一样的,帮忙看看