Oracle 中in超过1000个值遇到ORA-01795: maximum number of expressions in a list is 1000

在开发中遇到报错:
Oracle 中in超过1000个值遇到ORA-01795: maximum number of expressions in a list is 1000
原因是例如如下sql:
SELECT * FROM USER WHERE ID IN (‘A’,‘B’,‘C’…)
在in条件后,只允许拼接最多1000个筛选元素。当超过1000条将会报错。所以解决方式是:分批处理
代码如下:

public void updateFxList(List<String> ids) {
        int batchSize = 800; // 每批处理 800 条数据
        int total = ids.size();
        int start = 0;
        int end = Math.min(start + batchSize, total);

        while (start < total) {
            List<String> batch = ids.subList(start, end);

            // 更新当前批次的数据
            kspjRepository.updateKspjStatusToFx(batch);

            // 更新下一批次的起始位置
            start = end;
            end = Math.min(start + batchSize, total);
        }
    }

int batchSize = 800; 定义了每次处理的数据量为 800 条。
int total = ids.size(); 获取传入的 ids 列表的总长度。
int start = 0;: 初始化开始索引为 0。
int end = Math.min(start + batchSize, total);: 计算结束索引,确保不会超出 ids 列表的实际长度。
while (start < total) {…}: 循环处理直到所有数据都被处理完毕。
List batch = ids.subList(start, end);: 根据当前的开始和结束索引从 ids 中截取一个子列表作为当前批次的数据。
kspjRepository.updateKspjStatusToFx(batch);: 调用仓库方法 updateKspjStatusToFx 来更新当前批次的数据状态。
start = end;: 更新开始索引为上一批次的结束索引。
end = Math.min(start + batchSize, total);: 计算下一个批次的结束索引,确保不会超出列表范围。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值