exp*_* da 2 sql oracle ora-00913
我的应用程序团队正在尝试使用他们的程序即时构建的 SELECT 查询从表中获取 85,000 个值。
SELECT * FROM TEST_TABLE
WHERE (
ID IN (00001,00002, ..., 01000)
OR ID IN (01001,01002, ..., 02000)
...
OR ID IN (84001,84002, ..., 85000)
));
Run Code Online (Sandbox Code Playgroud)
但我收到错误“ORA-00913 值太多”。
如果我将 in 子句减少到仅 65,000 个值,则不会收到此错误。IN CLAUSE(伴随 OR 子句)的值是否有任何限制
小智 5
问题不在于in列表,而在于列表。or它是关于- 分隔的复合条件的数量限制。我相信该限制并不适用于具体情况,而是适用于使用、和、带或不带括号or的任意组合的任何复合条件。而且,重要的是,这似乎没有在任何地方记录下来,也没有得到 Oracle 任何人的承认。orandnot
正如您已经清楚地知道的那样,列表中的项目数有 1000 项的限制in- 您已经解决了这个问题。
解析器将in条件扩展为复合的、or分隔的条件。适用于您的限制是我已经提到的限制。
限制为 65,535 个“原子”条件(与or, and,放在一起not)。编写例子来证实这一点并不困难。
更好的问题是为什么(当然,以及如何解决它)。
我的怀疑:为了评估这种复合条件,编译的代码必须使用堆栈,这很可能是作为数组实现的。该数组由无符号 16 位整数索引(为什么这么小,只有 Oracle 知道)。所以堆栈大小不能超过2^16 = 65,536;实际上只少了一个,因为 Oracle 认为数组索引从 1 开始,而不是从 0 开始 - 所以它们丢失了一个索引值 (0)。
解决方法:创建一个临时表来存储 85,000 个值。请注意,使用元组(实际上是人为的)的想法允许您克服单个in列表的 1000 个值的限制,但它无法解决以or-分隔的复合条件中 65,535 个“原子”条件的限制;此限制适用于最一般的情况,无论条件最初来自何处(in列表或其他任何内容)。
有关 AskTom 的更多信息 - 您可能想从底部开始(我的评论,是线程中的最后一个):
| 归档时间: |
|
| 查看次数: |
363 次 |
| 最近记录: |