Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql oracles嵌套表中的最大行数是多少_Sql_Database_Oracle_Oracle12c_Nested Table - Fatal编程技术网

Sql oracles嵌套表中的最大行数是多少

Sql oracles嵌套表中的最大行数是多少,sql,database,oracle,oracle12c,nested-table,Sql,Database,Oracle,Oracle12c,Nested Table,oracle嵌套表中最大可能行数是多少 更新 CREATE TYPE nums_list AS TABLE OF NUMBER; 这会产生错误:ORA-22813操作数值超出系统限制,对象或集合值太大因此集合中可以有2**31个元素。这一限制至少从8.1.6开始就没有改变过,当然,它在未来可能会改变 另一个观察结果是,嵌套表本身并不是太大或占用太多内存。通过异常处理程序,您可以看到函数没有抛出错误。您可以在匿名块中填充相同的内容: CREATE TYPE nums_list AS TABLE

oracle嵌套表中最大可能行数是多少

更新

CREATE TYPE nums_list AS TABLE OF NUMBER;

这会产生错误:
ORA-22813操作数值超出系统限制,对象或集合值太大

因此集合中可以有2**31个元素。这一限制至少从8.1.6开始就没有改变过,当然,它在未来可能会改变

另一个观察结果是,嵌套表本身并不是太大或占用太多内存。通过异常处理程序,您可以看到函数没有抛出错误。您可以在匿名块中填充相同的内容:

CREATE TYPE nums_list  AS TABLE OF NUMBER;

CREATE OR REPLACE  FUNCTION  generate_series(from_n NUMBER, to_n NUMBER)
RETURN nums_list AS
ret_table nums_list := nums_list();
BEGIN

  FOR i IN from_n..to_n LOOP
    ret_table.EXTEND;
    ret_table(i) := i;
  END LOOP;
  RETURN ret_table;

END;


SELECT count(*)   FROM TABLE ( generate_series(1,4555555) );
您也可以从块中调用函数:

DECLARE
  ret_table nums_list := nums_list();
BEGIN
  FOR i IN 1..4555555 LOOP
    ret_table.EXTEND;
    ret_table(i) := i;
  END LOOP;
  dbms_output.put_line(ret_table.count);
END;
/

anonymous block completed
4555555
只有将其用作表集合表达式时,才会出现错误:

DECLARE
  ret_table nums_list;
BEGIN
  ret_table := generate_series(1,4555555);
  dbms_output.put_line(ret_table.count);
END;
/

anonymous block completed
4555555
原因文本引用排序上下文,您的查询正在执行排序:

SQL Error: ORA-22813: operand value exceeds system limits
22813. 00000 -  "operand value exceeds system limits"
*Cause:    Object or Collection value was too large. The size of the value
           might have exceeded 30k in a SORT context, or the size might be
           too big for available memory.
*Action:   Choose another value and retry the operation.
正如@a_horse_和_no_名称所建议的那样,您可以通过将函数流水线化来避免问题:

------------------------------------------------------------------------------------------------------
| Id  | Operation                          | Name            | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                   |                 |     1 |     2 |    29   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE                    |                 |     1 |     2 |            |          |
|   2 |   COLLECTION ITERATOR PICKLER FETCH| GENERATE_SERIES |  8168 | 16336 |    29   (0)| 00:00:01 |
------------------------------------------------------------------------------------------------------
这仍然会对聚合进行
排序
,但它似乎不再介意了。不太清楚这两种情况下为什么会这样;也许其他人可以解释它在做什么。(顺便说一句,我是在11gR2实例中这样做的;我没有一个12c实例来验证行为是否相同,但您的症状表明会是这样)。或者问题不在于排序上下文,而在于可用内存。在我的环境中,您的版本似乎持续工作到4177918个元素,这似乎不是一个重要的数字,所以可能与环境有关


但这取决于你打算如何使用这些藏品;从PL/SQL上下文来看,您的原始版本可能更合适。

Justin,在11g中,他们增加了它?@OracleUser-也就是说2147483647,是2**31-1-所以它没有改变?事实上,Alex我应该承认,我假设2**31是一个五位数。。那么它是2^31吗?@OTARIKI-在本文中,
**
的意思与
^
相同,也就是说,31减去1的幂的极限是2,即2147483647。稍后的文档(正如OracleUser链接到的)显示了实际的数字,可能是为了避免这种混淆…@OTARIKI-2**31只是2^31的另一种表示法(两个提升到31次方),计算结果超过20亿。为什么不改用流水线函数呢?我猜你达到了内存限制,而不是“最大行数”限制-使用这样的集合意味着,所有的数字都需要保留在内存中。非常好的建议,非常感谢
CREATE OR REPLACE  FUNCTION  generate_series(from_n NUMBER, to_n NUMBER)
RETURN nums_list PIPELINED AS
BEGIN

  FOR i IN from_n..to_n LOOP
    PIPE ROW (i);
  END LOOP;
  RETURN;

END;
/

SELECT count(*)   FROM TABLE ( generate_series(1,4555555) );

  COUNT(*)
----------
   4555555