【问题标题】:ORA-00907: missing right parenthesis when create varrayORA-00907: 创建 varray 时缺少右括号
【发布时间】:2014-03-28 15:47:05
【问题描述】:

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

这里有什么问题?

【问题讨论】:

    标签: oracle


    【解决方案1】:

    Oracle IN 子句有限制。

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

    阅读hereherehere

    【讨论】:

    • 你在这个查询“IN”子句中看到了什么?
    • 从 G.ID 所在的 ANY_TABLE G 中选择 G.ID、G.NAME (
    • 您说的是错误“ORA-01795:列表中的最大表达式数为 1000 个提示”。但就我而言,另一个错误。
    • 如何重写这个查询? “0,1,2,3,4,5,6,7,8,9,10..”我作为参数查询
    • @user1881712 该限制也适用于对象构造函数的参数数量 - 在本例中为 VARRAY 构造函数。你不能在构造函数中创建一个元素超过 1000 个的 varray。
    【解决方案2】:

    在我看来,你在滥用集合,至少我不确定你所做的事情是否好。

    据我了解,您在运行之前会生成此查询,那么这样做有什么问题?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-23
      • 2018-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多