关于Mybatis出现的ORA-01795错误

   当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)

 第一种方法常常会进行全表扫描,第二种方法效率会更高些。

原文地址:https://www.cnblogs.com/wangkundentisy/p/12713675.html