ORA-01795の原因(In値が多すぎる)及び解決方法


システムはSQL異常を報告しました。内容は以下の通りです。
java.sql.SQLException:ORA-01795:maximnumber of expressions in a list is 1000
投げ異常時に実行するSQL文を探し出して、容貌は驚くべきではありませんて、とても普通のSQL文、内容は類似しています。SELECT*FROM DUAL T WHERE T.DMMY IN('1'、'2'、'3')、ただINの後括弧の中の主要な鍵盤の値は多くなりました。他は特にありません。
ORA-01795で与えられた内容はSQL文のexpressionsの中でlistが受ける最大値は1000であり、ORA-01795の説明を調べて、INの後括弧の中のキーパッドの値が1000以上あることが確認された。
解決の考えは大きく二つあります。一つはJOINまたはEXISTを使うことです。もう一つはやはりINを使うことです。しかし、条件を複数の1000未満のINに分けます。
SELECT * FROM DUAL T WHERE T.DUMMY IN ('1', '2', '3',...,'1000') OR IN ('1001', '1002', ..., '2000') OR ...
次は第二の方法で解決します。
StringBuffer sb = new StringBuffer();

int inNum = 1; //   IN    
for(int i=0; i0) {
        sb.append("'" + custNOs[i] + "' ) OR CUST_NO IN ( ");    //  ORA-01795  
        inNum = 1;
    }
    else {
        sb.append("'" + custNOs[i] + "', ");
        inNum++;
    }

}

String selectSQL = "SELECT * FROM CUSTOMER T WHERE T.CUST_NO IN ( " + sb.toString() + " )";