在我的程序中有很多情况需要获取有关知道ID的其他信息。所以我有id列表,长度可能很长(例如100000个元素)。
如何在不使用临时表的情况下使用此列表并在oracle中传输以获取sql?
不,我尝试使用收藏:
CREATE TYPE TEST_VARRAY IS VARRAY(5000) OF NUMBER(18);
SELECT G.ID, G.NAME FROM ANY_TABLE G
WHERE G.ID IN
(
SELECT COLUMN_VALUE FROM TABLE(
NEW TEST_VARRAY
(0,1,2,3... and so on ...,995,996,997,998,999)
)
);
有1000个数字。当我尝试执行此查询时,会出现错误ORA-00907: missing right parenthesis
提示!但是如果我先删除0(所以我们有999个数字)sql执行正常。
这里有什么问题?
答案 0 :(得分:5)
Oracle IN子句有一个限制。
以逗号分隔的表达式列表不能超过1000个 表达式。逗号分隔的表达式列表可以包含 任意数量的集合,但每组可以包含不超过1000 表达式。
答案 1 :(得分:1)
在我看来,你是在滥用收藏品,至少我不确定像你这样的东西是好的。
据我了解,你在运行前生成了这个查询,那么问题是什么呢?
with ids as (select /*+ materialize */ 1 id from dual union all
select 2 from dual union all
select 3 from dual union all
select 4 from dual union all
/* repeat with the ids you need */
select 9999 from dual)
select *
from yourTable, ids
where yourTable.id = ids.id;
那就是它!没有任何限制,仅限纯SQL。我添加了materialize
提示以确保它与性能无关,但我认为可以跳过它。
没有临时表,没有集合,没有什么可以创建和支持。只是SQL。
如果你将with
中的id放入from
子句中,它将适用于任何RDBMS(我猜)。