当oracle中执行带有in的SQL语句时,如果in后面的集合中元素的数目超过1000时,就会报错,即ORA-01795错误,此时可以有两种解决方案:
第一种:将SQL语句中的in(a,b,c..)的形式改成(in a or in b or in c.....)的形式
1.原来的语句
SELECT * FROM TABLE_A WHERE 1 = 1 AND SNO IN <foreach item="item" index="index" collection="snos" open="(" separator="," close=")"> #{item} </foreach>
2.修改后的语句
SELECT * FROM TABLE_A WHERE 1 = 1 AND <foreach item="item" index="index" collection="snos" open="(" separator="OR" close=")"> SNO IN #{item} </foreach>
或者为
IN(a,b,c...) OR IN(r,s,t...) OR IN(x,y,z...)
这种形式只要保证集合中元素的个数小于1000即可
第二种:将in集合中的数据插入到一个临时表中,然后筛选条件即这个临时表中的数据,语句如下:
SELECT * FROM TABLE_A WHERE 1 = 1 AND SNO IN(SELECT SNO FROM TMP)
第一种方法常常会进行全表扫描,第二种方法效率会更高些。