oracle分批查询数据提交

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle分批查询数据提交相关的知识,希望对你有一定的参考价值。

我在oracle一张表中查询一个字段phone_number,有几千行,我想100行100行的查询出来提交。。

几千行对 oracle 来说不是问题,可以一次提交
如果一定要这么做,有两种方式:
一,用游标打开,一行拼一个insert 语句,并计数;满100后提交
二,分页查询,每页100行 ,然后提交
我觉得:能一次提交的尽量不要分开提交,如果提交到一部分时候,出现问题了,提交的不能回滚了。增加了业务逻辑的复杂性。追问

领导让分开提交的,有没有例子啊??不知道怎么写,谢谢你

参考技术A 批量绑定,分批提交。
例v$parameter表中name字段,代码如下:
declare
type coll_type is table of v$parameter.name%type index by pls_integer;--定义集合类型
coll coll_type;--定义集合对象
v_index pls_integer;--角标
cursor cur is--定义游标
select name
from v$parameter;
begin
open cur;
loop
fetch cur bulk collect into coll limit 20;--limit 1000限制批操作量100
for v_index in 1 .. coll.count
loop
dbms_output.put_line(coll(v_index));--输出集合中数据
end loop;
commit;
exit when cur%notfound;
end loop;
close cur;
end;本回答被提问者采纳

从数据库中分批取数据进行处理

思路1:

用分页查询的方式取

先查询出要处理的总数据量 count,然后假设每批要处理100条,

代码

 //获取可push的记录进行发送消息
    private void getData()
        //查出总数据量
        long count = xxxMapper.countByExample(example);
        int pageSize = 100;
        long pageNum = count / pageSize;
        long left = count % pageSize;
        if (left >= 1) 
            pageNum++;
        


        List<Object> list;
        int pageCount = 1;
        //循环获取
        while (true) 
            //分批查询数据
            RowBounds rowBounds = new RowBounds((pageCount-1)*pageSize,pageSize);
            list = xxxMapper.selectByExampleWithRowbounds(example, rowBounds);
            //可以对分批查出的数据做处理
            if(pageCount >= pageNum) 
                break;
            
            pageCount++;
        
    

思路2:

用取模的方式取数据

int size = 1000;
int threadNum = count / size + 1;

for (int i = 0; i < threadNum; i++) 
   Map paramMap = new HashMap();
   //分批查询
   paramMap.put("threadNum", threadNum);
   paramMap.put("mod", i);
   //用 paramMap 去取模查询数据库//  SELECT * FROM `tableName` WHERE id % threadNum = mod ; 即查询条件为 自增主键除以线程数余数为当前遍历到的 i

 

以上是关于oracle分批查询数据提交的主要内容,如果未能解决你的问题,请参考以下文章

干货 | 时间序列数据的对齐和数据库的分批查询

python时间序列数据的对齐和数据库的分批查询

循环分批从数据库获取数据

循环分批从数据库获取数据

循环分批从数据库获取数据

oracle 可以多线程插入吗