如果出現這個錯誤說明你傳的參量是超過了一千個值;列如,你拼接了1001個id;
如何解決那,我這里提供兩種方法:
1.每1000條加一個or in
列:
原:select p.* from t_premium p where p.premium_id in ('0','1'........,'1000',......'2000');
現:select p.* from t_premium p where p.premium_id in ('0','1'......‘999’)or in (’1000',......'1999');
如何實現那?
看下邊
1 public static void main(String[] agrs) throws Exception { 2 StringBuffer thirdPartyPayId=new StringBuffer(); 3 for (int j = 0; j < 20; j++) { 4 if((j%10) == 0 && j > 1){ 5 thirdPartyPayId.deleteCharAt(thirdPartyPayId.length() -1); 6 thirdPartyPayId.append(") OR " + "info.third_party_pay_id" + " IN ('" + j + "',"); 7 }else{ 8 thirdPartyPayId.append("'").append(j).append("',"); 9 } 10 } 11 thirdPartyPayId.deleteCharAt(thirdPartyPayId.length() -1); 12 System.out.println(thirdPartyPayId.toString()); 13 }
我這里用j代替了循環的"info.third_party_pay_id" ,兄弟們用的時候可以遍歷自己的list,獲取參量;
thirdPartyPayId.deleteCharAt(thirdPartyPayId.length() -1):去掉多余的標點符號,不能省;
SELECT DISTINCT
nvl(info.apply_policy_no,'無') applyPolicyNo
FROM T_THIRD_PARTY_PAY_INFO info,t_department_define o
WHERE info.department_code = o.internal_department_code(+)
AND (info.third_party_pay_id IN ($thirdPartyPayId$ ))
AND info.FLAG = '2'
注:1.這種方式效率很慢;數據量小的話也就無所謂;數據量大的話不建議使用;
2.()這兩個括號必須要,因為(+)這個不能和in, not in 一起使用,但是因為
2.傳遞的參量轉換成一個sql查詢
SELECT DISTINCT
nvl(info.apply_policy_no,'無') applyPolicyNo
FROM T_THIRD_PARTY_PAY_INFO info,t_department_define o
WHERE info.department_code = o.internal_department_code(+)
AND info.third_party_pay_id IN (
SELECT
sd.third_party_pay_id
FROM T_SOURCE_DOCUMENT sd,t_voucher v
WHERE sd.VOUCHER_ID = v.VOUCHER_ID and v.voucher_code=#voucherCode#
AND sd.third_party_pay_id IS NOT NULL
and v.CANCEL_STATUS != '2'
)
AND info.FLAG = '2'
就是說你獲取參量的那個查詢sql放進來;
后記:應該還有join以及exists兩種思路。但用起來感覺所鎖定目標不太清晰。故沒做考量;