刚才把那个错误又再现了一遍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
呵呵, where x in (,[,...]) 这样格式的in-list 确实有1000以内的限制 可以通过array bind或者temporary table解决
如果是 where x in (select x1 from ...) 这样格式的没有问题
为什么存在这样的差异?真让人弄不明白啊...呵呵,能讲讲临时表是如何解决的吗?是不是把条件放到临时表,然后利用where x in (select x1 from 临时表 ...) 来实现的?
哦,是这样的啊, 哈哈! 明白了!!!! 多谢 xiaoxiao1984(笨猫一只^_^)
因为oracle9i中的in字句最多只能有1000个条件值 将ID IN ()改写为两个或者多个ID IN () OR ID IN () 保证每个in列表的数量不超过1000 就可以了, 我刚才也试验了下(可不知在10g里是不是也这样?)
到999个in 条件后, 写一个or 试试
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的限制
ora-01795:maximum number of expressions in a list is 1000
可以通过array bind或者temporary table解决
哈哈!
明白了!!!!
多谢 xiaoxiao1984(笨猫一只^_^)
将ID IN ()改写为两个或者多个ID IN () OR ID IN () 保证每个in列表的数量不超过1000
就可以了,
我刚才也试验了下(可不知在10g里是不是也这样?)
写一个or 试试
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的限制