为啥批量收集到子句限制了 pl/sql 中嵌套表的大小

Posted

技术标签:

【中文标题】为啥批量收集到子句限制了 pl/sql 中嵌套表的大小【英文标题】:Why bulk collect into clause is limiting the size of nested table in pl/sql为什么批量收集到子句限制了 pl/sql 中嵌套表的大小 【发布时间】:2011-10-22 11:23:51 【问题描述】:
declare
   type yy is table of t12.name%type;
   y yy:=yy();
   n number:=1;
begin
   y.extend(10);
   select name bulk collect into y from t12;
   --select name into y(5) from t12 where id=1; If i uncomment this line it gives error
   for i in (select name from t12)
   loop
      dbms_output.put_line(y(n));
      n:=n+1;
   end loop;
end;

【问题讨论】:

表 t12 中只有 4 行我使用 y.extend(10) 分配了 10 个块。为什么我无法访问 y(5) 注释 select name bulk collect 行并取消注释当前注释的行...错误应该消失了... are nooooooooo....这就是问题所在..我知道它会起作用...但问题是...批量收集..我的嵌套表在做什么。 .为什么我不能在使用批量收集后向此表添加更多元素... 您可以添加更多元素...您尝试访问索引 5 处的元素,而无需首先检查该元素是否存在...builk collect 替换了您的嵌套表 - 它创建了一个新表. 现在这就是我所谓的概念构建...我也这么想..但我没有信心..但现在..一切都很清楚..tnx反正.... 【参考方案1】:

你能在不先初始化y 的情况下进行测试吗?嵌套表不应该使用批量收集进行初始化。然后你可以用extend添加元素。

declare
  type yy is table of t12.name%type;
  y yy;
begin
  select name bulk collect into y from t12;
end;

【讨论】:

您的代码将给出错误..静态...引用未初始化的集合...如果您没看错,我已经使用构造函数初始化了表 y... 我也做了 y.extend(10)..所以实际上我没有使用批量收集初始化它我只是分配一些值 它不会引发错误。请参阅BULK COLLECT Clause 中的示例 12-16。您正在使用y yy:=yy(); 对其进行初始化。不应该像您那样使用批量收集。

以上是关于为啥批量收集到子句限制了 pl/sql 中嵌套表的大小的主要内容,如果未能解决你的问题,请参考以下文章

PL / SQL:ORA-00907:批量收集错误

Oracle:批量收集性能

PLSQL - 批量收集的最大限制?

oracle ORA-06502:PL/SQL:数字或值错误:批量绑定:截断绑定

为啥 PL/SQL Bulk DML 对具有父子约束表的大型数据集运行缓慢?

PL/SQL嵌套表中STORE AS的含义