ORA-00907:创建varray时缺少右括号

时间:2013-09-26 09:41:49

标签: oracle

在我的程序中有很多情况需要获取有关知道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执行正常。

这里有什么问题?

2 个答案:

答案 0 :(得分:5)

Oracle IN子句有一个限制。

  

以逗号分隔的表达式列表不能超过1000个   表达式。逗号分隔的表达式列表可以包含   任意数量的集合,但每组可以包含不超过1000   表达式。

阅读hereherehere

答案 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(我猜)。