在Spring批处理中从oracle数据库获取结果集的分区程序

时间:2015-06-18 19:37:24

标签: java sql oracle spring-batch

我需要将查询结果从平面文件中提取出来。有没有办法对结果集进行分区,以便多个线程可以访问它。

我尝试了基于ROWNUM的分区而没有排序,但是当多个线程ROWNUM执行相同的查询时,不会保持相同(因为我没有因性能影响而排序)并在输出中创建重复项

2 个答案:

答案 0 :(得分:1)

使用ORA_HASH将行拆分为确定性存储区:

select *
from
(
    select level, ora_hash(level, 2) bucket
    from dual
    connect by level <= 10
)
where bucket = 2;


LEVEL   BUCKET
-----   ------
    1        2
    3        2
    6        2
   10        2

它是一个基于0的数字。使用bucket = 0bucket = 1获取其他2套。

答案 1 :(得分:0)

改用ROWID。每条记录的ROWID都是不可变的。或者只使用主键(或具有足够不同值的任何其他字段)来分配子集中的数据。

select * 
from table    
where SUBSTR(ROWIDTOCHAR(ROWID),-1) IN ('A','a','0');

select * 
from table       
where SUBSTR(ROWIDTOCHAR(ROWID),-1) IN ('B','b','1');

or 

select * 
from table       
where SUBSTR(ROWIDTOCHAR(ROWID),-1) between 'A' and 'Z';
etc.

你必须尝试一下where子句。据我所知,rownum的最后一个字符可以包含[A-Z] [a-z] [0-9] +和/