以前只是听说用in子句时,如果in (.....)中比较多的话会速度很慢,昨天在PL/SQL中执行一个包含in的字句,此时in(.....)中的条件超过一千个,结果PL/SQL报关于in的错误(具体错误信息偶现在也不记得)。是不是说in(.....)的条件也有个数限制啊?碰到这样的问题怎么解决啊?反正我最后全部用or来连接这1千多个条件就可以查出数据了

解决方案 »

  1.   

    刚才把那个错误又再现了一遍select * from IS_OBJ_FROM_FLOW_INSTANCE where OBJ_TYPE=4 and DATA_ID in (1,7,8,9,10,227,453,454,455,486,504,505,525,1230,1231,1234,1239,1240,1251,1273,1274,1282,1285,6050,6052,6051,6053,6055,6058,6060,6059,6062,6063,6064,6068,6069,6070,6073,6065,6084,6085,6086,6088,6090...................) 条件有2419个执行这个sql语句PL/SQL报的错误是:
    ora-01795:maximum number of expressions in a list is 1000
      

  2.   

    呵呵, where x in (,[,...]) 这样格式的in-list 确实有1000以内的限制
    可以通过array bind或者temporary table解决
      

  3.   

    如果是 where x in (select x1 from ...) 这样格式的没有问题
      

  4.   

    为什么存在这样的差异?真让人弄不明白啊...呵呵,能讲讲临时表是如何解决的吗?是不是把条件放到临时表,然后利用where x in (select x1 from 临时表 ...) 来实现的?
      

  5.   

    哦,是这样的啊,
    哈哈!
    明白了!!!!
    多谢 xiaoxiao1984(笨猫一只^_^)
      

  6.   

    因为oracle9i中的in字句最多只能有1000个条件值
    将ID IN ()改写为两个或者多个ID IN () OR ID IN () 保证每个in列表的数量不超过1000
    就可以了,
    我刚才也试验了下(可不知在10g里是不是也这样?)
      

  7.   

    到999个in 条件后,
    写一个or 试试
      

  8.   

    ex:
    create or replace type myTableType as table of number;create or replace function in_list( p_string in varchar2 )
    return myTableType
    as
    l_data         myTableType := myTableType();
    l_string       long default p_string || ',';
    l_n            number;
    begin
      loop
        exit when l_string is null;
        l_data.extend;
        l_n := instr( l_string, ',' );
        l_data( l_data.count ) := substr( l_string, 1, l_n-1 );
        l_string := substr( l_string, l_n+1 );
      end loop;
      return l_data;
    end;SQL> select *   from THE ( select cast( in_list('1,2,3,5,12') as mytableType ) f
    rom dual ) a;COLUMN_VALUE
    ------------
               1
               2
               3
               5
              12
    就可以避免1000的限制