关于oracle批量插入数据问题

本人做项目遇到了一个很操蛋的问题,是关于数据插入的,找了很多资料,也问了很多人,但是解决方法还是不是很给力,所以自己又想了想,自认为想出来个给力的方法,所以写出来,希望大家碰到相同的问题的时候有办法能解决,不啰嗦,上代码:

首先是对数据库的操作:

create or replace type v_varchar is table of nvarchar2(15);

create or replace procedure InsSell(
v_CHARGING in v_varchar,
v_ADDRESS_LOCAL in v_varchar,
v_ADDRESS_REMOTE in v_varchar)
as
 i integer;
begin
 for i in 1..v_CHARGING.count loop
     INSERT INTO DX_MMS_AREAINFO (ID,CHARGING,ADDRESS_LOCAL,ADDRESS_REMOTE) VALUES(SEQ_MMS_AREAINFO.NEXTVAL,v_CHARGING(i),v_ADDRESS_LOCAL(i),v_ADDRESS_REMOTE(i));
 end loop;
 DELETE FROM DX_MMS_AREAINFO M WHERE M.ROWID > (SELECT MIN(T.ROWID) FROM DX_MMS_AREAINFO T WHERE M.CHARGING=T.CHARGING);
end InsSell;


在这个地方呢首先生命一个v_varchar的数组,然后呢,写存储过程,v_CHARGING 让他属于这个类型,继续就是循环了。

 DELETE FROM DX_MMS_AREAINFO M WHERE M.ROWID > (SELECT MIN(T.ROWID) FROM DX_MMS_AREAINFO T WHERE M.CHARGING=T.CHARGING);

这个呢,是我现在发现最高效的去重,因为使用了ROWID,所以速度还是很不错的,最少能满足我的项目要求,当然了,希望能有人贴出更高效的去重的sql语句。

下面是java代码:

public void insertintoareainfo(List list) throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException{
        GetConn getConn = new GetConn();
        Connection con = getConn.getConn();
        oracle.sql.ArrayDescriptor a_id = null;
        oracle.sql.ArrayDescriptor a_ticketid = null;
        oracle.sql.ArrayDescriptor a_name = null;
        oracle.sql.ArrayDescriptor a_age = null;
        Object[] s_id = new Object[list.size()];
        Object[] s_ticketid = new Object[list.size()];
        Object[] s_name = new Object[list.size()];
        for (int i = 0; i < list.size(); i++) {
            NumberAddress num = (NumberAddress) list.get(i);
            s_id[i] = new String(num.getNumPhone());
            s_ticketid[i]=new String(num.getNumBelong());
            s_name[i]=new String(num.getNumRoam());
        }
        try {
            oracle.sql.ArrayDescriptor a_nvarchar =ArrayDescriptor.createDescriptor("V_VARCHAR", con);
            ARRAY id_test = new ARRAY(a_nvarchar, con, s_id);
            ARRAY ticketid_test = new ARRAY(a_nvarchar, con, s_ticketid);
            ARRAY name_test = new ARRAY(a_nvarchar, con, s_name);
            CallableStatement cstmt = con.prepareCall("{call InsSell(?,?,?)}");
            cstmt.setArray(1, id_test);
            cstmt.setArray(2, ticketid_test);
            cstmt.setArray(3, name_test);
            cstmt.execute();
            con.commit();
            
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Insert into DB error: " + e.getMessage());
        }
    }

这个呢就是插入的时候需要代码,很容易理解,大家看看吧,在这里我想说明下,存储过程里可以写成表的类型,不过我不是很推荐,嘿嘿。就这么多了,希望对大家会有帮助。速度很快50W的数据量瞬间就完成了,但是去重,越来越慢。。悲哀。忘了说明下,我在这之前分别试验了,addbath和直接一条条的插入,都很慢,addbath这个我推荐10000左右的数据量,而且是大型的网站数据库的话,我个人建议,前边用nosql数据库,然后用oracle数据库作为备份。就这么多了,希望对各位能有帮助。最后呢,求一条去重的sql,要超级无敌旋风给力的高效。就这么多了,第一次写这个大家轻点喷。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值