请问如何调整in子句的数量限制?

zhghl 2006-04-18 09:27:20
我们要用select in ( 1,2,3... ) 超过1000个,好像oracle只支持1000个值,请问有什么办法解决?
...全文
342 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
waterfirer 2006-04-19
  • 打赏
  • 举报
回复
那些数据不能用一个select提取,所以不能用in(select),谢谢
-------
当然可以用select提取了。
select 1 from dual union all
select 2 from dual union all
......
select n from dual
就行了
沝林 2006-04-19
  • 打赏
  • 举报
回复
如果你的范围值是固定值,那么直接把这些数据放在一张新建的表格里就可以了;如果范围值不确定,可以建临时表或创建表对象实现,临时表不多说了,很容易实现的,创建表对象方法如下(可以放在包中实现):
先创建类型:

CREATE OR REPLACE TYPE myTableType AS TABLE OF VARCHAR2(20);

创建函数:
CREATE OR REPLACE FUNCTION str2tbl(Name1 in type, Name2 in type, ...) RETURN myTableType
AS
l_data myTableType := myTableType();
l_p PLS_INTEGER;
BEGIN
LOOP
exit when ...
...
l_data.EXTEND;
...
...
l_data(l_p) := :value;
END LOOP;
RETURN l_data;
END;

例如我生成了1101条范围值
SQL> SELECT COUNT(*) FROM (TABLE(str2tbl));

COUNT(*)
----------
1101

SQL> select ID from test t WHERE ID IN (SELECT * FROM (TABLE(str2tbl)));

ID
----------
1
2
3
4
5
6
7
8
9
12
13
14

12 rows selected
icedut 2006-04-19
  • 打赏
  • 举报
回复
谢谢,请问怎么用中间表或配置表?直接建立一个临时表,然后把数据insert进去吗?
---
这样也可以的
效率也会好一点
zhghl 2006-04-19
  • 打赏
  • 举报
回复
谢谢,请问怎么用中间表或配置表?直接建立一个临时表,然后把数据insert进去吗?
zhghl 2006-04-18
  • 打赏
  • 举报
回复
那些数据不能用一个select提取,所以不能用in(select),谢谢
waterfirer 2006-04-18
  • 打赏
  • 举报
回复
in (select ...)
用结果集来做
dp_555 2006-04-18
  • 打赏
  • 举报
回复
友情接分。。。
kingofworl 2006-04-18
  • 打赏
  • 举报
回复
用一个配置表把,把in 中的值放入
wangzk0206 2006-04-18
  • 打赏
  • 举报
回复
可以用
in(a,b,c...) or in(d,e,f,...)
这样速度会很慢,最好用中间表或是其他,这些的具体问题具体分析
kzy7517 2006-04-18
  • 打赏
  • 举报
回复
改成or.
boydgmx 2006-04-18
  • 打赏
  • 举报
回复
1000个是Oracle的限制,不可能更改

所以,只能借助中间表
skytears 2006-04-18
  • 打赏
  • 举报
回复
太多了还是用临时表吧

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧