SELECT FROM用户定义的表类型,ORA-22813

时间:2015-10-23 07:21:57

标签: oracle plsql oracle11g

我有一个非常有趣的问题。

我有用户定义的表格类型

create or replace TYPE "TABLE_OF_NUMBER" AS TABLE OF NUMBER

我有数百万行的表格 - calls

我有pl / sql块可以正常使用

declare
  v_calls     TABLE_OF_NUMBER;
begin
  select id bulk collect
  into v_calls
  from calls;
end;

我有另一个pl / sql块,它给我一个错误

declare
  v_calls     TABLE_OF_NUMBER;
  t1 number;
begin
  select id bulk collect
  into v_calls
  from calls;

  select count(*) into t1 from table(v_calls);
end;
  

ORA-22813:操作数值超出系统限制。

我找到了错误的解释:

  

原因:对象或集合值太大。的大小   在SORT上下文中,值可能已超过30k,或者大小可能超过30k   对于可用内存来说太大了。

我的目标是获得这个:

declare
  v_calls     TABLE_OF_NUMBER;
  v_events TABLE_OF_NUMBER;

begin

  select id bulk collect
  into v_calls
  from calls;

  select id bulk collect
  into v_events 
  from events
  where call_id in (select * from table(v_calls));

end;

但我已经发现问题命令是select * from table(v_calls)

我没有找到任何有关TABLE(user_defind_table)命令限制的内容。

有谁知道问题是什么,我该如何避免?

2 个答案:

答案 0 :(得分:3)

可能的解决方案:

<EFACT_D96A_INVOIC>
  <NADLoop1>
    <NAD NAD09="SE" NAD08="111 11" NAD07="" NAD06="CITY" NAD01="DP">
      <C082 C08203="9" C08202="" C08201="7350015610088"/>
      <C058 C05801=""/>
      <C080 C08001="TESTNAME"/>
      <C059 C05901="TESTSTREET 35"/>
    </NAD>
  </NADLoop1>
</EFACT_D96A_INVOIC>

答案 1 :(得分:1)

可以找到select * from table(v_calls)的限制here

我找不到一些解决方案:

  1. 正如@Stawros所说 - 使用bulk collect ... limit在我的情况下,性能会急剧下降,因此对我来说不是解决方案

  2. 使用临时表而不是用户定义的表。它有助于避免错误,但性能仍然很差

  3. 更改整个代码(逻辑) - 不幸的是,这是我的方式。