3

在我的程序中,有很多情况我需要获取有关知道 id 的其他信息。所以我有 ids 列表,它的长度可能很长(例如其中有 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 执行正常。

这里有什么问题?

4

2 回答 2

5

Oracle IN 子句有限制。

以逗号分隔的表达式列表最多可以包含 1000 个表达式。以逗号分隔的表达式集合列表可以包含任意数量的集合,但每个集合最多可以包含 1000 个表达式。

在此处此处此处阅读

于 2013-09-26T10:11:02.520 回答
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。

如果您将 id 从withintofrom子句中取出,它将在任何 RDBMS 中工作(我猜)。

于 2014-03-17T12:17:44.690 回答