【Oracle/jdbc】如何把带有timestamp字段的1表数据倒腾到同样结构的2表,注意两表不同机不同库。


【任务】

A机上有个1表,B机上有个2表,需要把1表数据全部倒腾到2表。

因为是两台机器两个库,故insert into t1 select * from t2的SQL就用不上了,需要写Java程序作为中转实现。

【难点】

1表中有个timestamp字段hdate,需要做特殊处理。

【突破口】

取timestamp数据时取其毫秒数存好;存timestamp数据时将毫秒数生成Timestamp对象再存入字段即可。

具体请看程序:

【程序】

注意:程序是在一台机器的同一DB中上实现,但不影响原理,大家可以把分割线上下的Connection理解为到不同DB的连接即可。

需要特别注意的我都用红色粗体标示了出来。

package com.hy.lab.timestamptransfer;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

class Emp{
    long id;
    String name;
    long hdate;
}
public class TableTransfer {
    //-- 以下为连接Oracle数据库的四大参数
    private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
    private static final String URL = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
    private static final String USER = "luna";
    private static final String PSWD = "1234";

    public static void main(String[] args) throws Exception{
        Connection conn = null;
        Statement stmt = null;

        try{
            Class.forName(DRIVER);
            conn = DriverManager.getConnection(URL, USER, PSWD);

            String sql="select id,name,hdate from emp428_1";
            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);

            List emps=new ArrayList<>();
            while (rs.next()) {
                Emp emp=new Emp();
                emp.id=rs.getInt("id");
                emp.name=rs.getString("name");
                // 取timestamp字段的自1971年来的毫秒数
                emp.hdate=rs.getTimestamp("hdate").getTime();
                emps.add(emp);
            }
//--------分割线,以上为从1表取数据,以下为往2表塞数据-------------------------
            conn.setAutoCommit(false);
            PreparedStatement pstmt = null;
            String insertSql="insert into emp428_2(id,name,hdate) values(?,?,?)";
            pstmt = conn.prepareStatement(insertSql);

            for(Emp emp:emps){
                pstmt.setLong(1,emp.id);
                pstmt.setString(2,emp.name);
                pstmt.setTimestamp(3,new Timestamp(emp.hdate));

                pstmt.addBatch();
            }

            pstmt.executeBatch();
            conn.commit();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

最后附上建表插值语句:

create table emp428_1(
    id number(12),
    name nvarchar2(20),
    hdate timestamp default sysdate,
    primary key(id)
);

insert into emp428_1(id,name) values(1,'andy');
insert into emp428_1(id,name) values(2,'bill');
insert into emp428_1(id,name) values(3,'cindy');
insert into emp428_1(id,name) values(4,'douglas');

create table emp428_2(
    id number(12),
    name nvarchar2(20),
    hdate timestamp default sysdate,
    primary key(id)
);

END

相关