To solve Oracle IN clause limitation, refer to the article ORA-01795 Oracle In Clause Limitation.
There is one more work around to the issue, which can be solved, by splitting the huge query containing > 1000 values in IN clause in to smaller queries and joining them using UNION.
Have a look at the sample implementation for the same.
import java.util.List;
public class QueryUtil
{
public static void main(String[] args)
{
QueryUtil qUtil = new QueryUtil();
List<String> itemList = new ArrayList<String>();
for (int i = 0; i < 1000; i++)
{
itemList.add(new String("ACCESS_NETFRONTVER32_2010"));
}
String query = "SELECT * FROM DEVICES WHERE STATUS = 'AVAILABLE' ";
System.out.println(qUtil.getInClauseQuery(itemList, query, "DEVICE_ID"));
}
public String getInClauseQuery(List<String> itemList, String query, String inClauseColumnName)
{
boolean tempFlag = false;
int unionCount = 0;
StringBuffer finalQuery = new StringBuffer();
StringBuffer subQuery = new StringBuffer();
String[] queryArr = query.split("WHERE");
if (queryArr.length > 1)
{
subQuery.append(" AND " + inClauseColumnName + " IN ( ");
}
else
{
subQuery.append(" WHERE " + inClauseColumnName + " IN ( ");
}
if (itemList.size() > 999)
{
for (int i = 0; i < itemList.size(); i += 500)
{
if (tempFlag)
{
finalQuery.append(" UNION ");
unionCount++;
}
StringBuffer sbTmp = new StringBuffer(1000);
boolean appendCom = false;
for (int j = i; (j < (i + 100)) && (j < itemList.size()); j++)
{
if (appendCom)
{
sbTmp.append(",");
}
sbTmp.append("'").append(itemList.get(j)).append("'");
appendCom = true;
}
finalQuery.append(query + subQuery + sbTmp.toString() + " ) \n");
tempFlag = true;
}
}
return finalQuery.toString();
}
}
Output:
UNION SELECT * FROM DEVICES WHERE STATUS = 'AVAILABLE' AND DEVICE_ID IN ( 'ACCESS_NETFRONTVER32_701','ACCESS_NETFRONTVER32_702','ACCESS_NETFRONTVER32_703','ACCESS_NETFRONTVER32_704','ACCESS_NETFRONTVER32_705','ACCESS_NETFRONTVER32_706','ACCESS_NETFRONTVER32_707','ACCESS_NETFRONTVER32_708','ACCESS_NETFRONTVER32_709','ACCESS_NETFRONTVER32_710','ACCESS_NETFRONTVER32_711','ACCESS_NETFRONTVER32_712','ACCESS_NETFRONTVER32_713','ACCESS_NETFRONTVER32_714','ACCESS_NETFRONTVER32_715','ACCESS_NETFRONTVER32_716','ACCESS_NETFRONTVER32_717','ACCESS_NETFRONTVER32_718','ACCESS_NETFRONTVER32_719','ACCESS_NETFRONTVER32_720','ACCESS_NETFRONTVER32_721','ACCESS_NETFRONTVER32_722','ACCESS_NETFRONTVER32_723','ACCESS_NETFRONTVER32_724','ACCESS_NETFRONTVER32_725','ACCESS_NETFRONTVER32_726','ACCESS_NETFRONTVER32_727','ACCESS_NETFRONTVER32_728','ACCESS_NETFRONTVER32_729','ACCESS_NETFRONTVER32_730','ACCESS_NETFRONTVER32_731','ACCESS_NETFRONTVER32_732','ACCESS_NETFRONTVER32_733','ACCESS_NETFRONTVER32_734','ACCESS_NETFRONTVER32_735','ACCESS_NETFRONTVER32_736','ACCESS_NETFRONTVER32_737','ACCESS_NETFRONTVER32_738','ACCESS_NETFRONTVER32_739','ACCESS_NETFRONTVER32_740','ACCESS_NETFRONTVER32_741','ACCESS_NETFRONTVER32_742','ACCESS_NETFRONTVER32_743','ACCESS_NETFRONTVER32_744','ACCESS_NETFRONTVER32_745','ACCESS_NETFRONTVER32_746','ACCESS_NETFRONTVER32_747','ACCESS_NETFRONTVER32_748','ACCESS_NETFRONTVER32_749','ACCESS_NETFRONTVER32_750','ACCESS_NETFRONTVER32_751','ACCESS_NETFRONTVER32_752','ACCESS_NETFRONTVER32_753','ACCESS_NETFRONTVER32_754','ACCESS_NETFRONTVER32_755','ACCESS_NETFRONTVER32_756','ACCESS_NETFRONTVER32_757','ACCESS_NETFRONTVER32_758','ACCESS_NETFRONTVER32_759','ACCESS_NETFRONTVER32_760','ACCESS_NETFRONTVER32_761','ACCESS_NETFRONTVER32_762','ACCESS_NETFRONTVER32_763','ACCESS_NETFRONTVER32_764','ACCESS_NETFRONTVER32_765','ACCESS_NETFRONTVER32_766','ACCESS_NETFRONTVER32_767','ACCESS_NETFRONTVER32_768','ACCESS_NETFRONTVER32_769','ACCESS_NETFRONTVER32_770','ACCESS_NETFRONTVER32_771','ACCESS_NETFRONTVER32_772','ACCESS_NETFRONTVER32_773','ACCESS_NETFRONTVER32_774','ACCESS_NETFRONTVER32_775','ACCESS_NETFRONTVER32_776','ACCESS_NETFRONTVER32_777','ACCESS_NETFRONTVER32_778','ACCESS_NETFRONTVER32_779','ACCESS_NETFRONTVER32_780','ACCESS_NETFRONTVER32_781','ACCESS_NETFRONTVER32_782','ACCESS_NETFRONTVER32_783','ACCESS_NETFRONTVER32_784','ACCESS_NETFRONTVER32_785','ACCESS_NETFRONTVER32_786','ACCESS_NETFRONTVER32_787','ACCESS_NETFRONTVER32_788','ACCESS_NETFRONTVER32_789','ACCESS_NETFRONTVER32_790','ACCESS_NETFRONTVER32_791','ACCESS_NETFRONTVER32_792','ACCESS_NETFRONTVER32_793','ACCESS_NETFRONTVER32_794','ACCESS_NETFRONTVER32_795','ACCESS_NETFRONTVER32_796','ACCESS_NETFRONTVER32_797','ACCESS_NETFRONTVER32_798','ACCESS_NETFRONTVER32_799','ACCESS_NETFRONTVER32_800' )