您好,欢迎访问一九零五行业门户网

Oracle教程:ORA-01795的原因及解决办法

找出抛异常时执行的sql语句,貌不惊人啊,很平常一sql语句,内容类似:select * from dual t where t.dummy in (
系统报出一sql异常,内容如下:
java.sql.sqlexception: ora-01795: maximum number of expressions in a list is 1000
找出抛异常时执行的sql语句,貌不惊人啊,很平常一sql语句,内容类似:select * from dual t where t.dummy 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 ...
由于个人感觉join不直观、exist含义不易理解,,采用了方式二,附代码:
2011-2-14 15:56:17,对代码进行了修正,感谢gouliming及时指出代码中的错误。
========================================================
stringbuffer sb = new stringbuffer();
int innum = 1; //已拼装in条件数量
for(int i=0; i    if(stringutil.isempty(custnos[i])) continue;
//这里不要犯低级错误而写成:if(i == custnos.length)
    if(i == (custnos.length-1))
        sb.append(' + custnos[i] + ');    //sql拼装,最后一条不加“,”。
    else if(innum==1000 && i>0) {
        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() + );
其它类似信息

推荐信息