我有一个非常有趣的问题。
我有用户定义的表格类型
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)
命令限制的内容。
有谁知道问题是什么,我该如何避免?
答案 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
我找不到一些解决方案:
正如@Stawros所说 - 使用bulk collect ... limit
在我的情况下,性能会急剧下降,因此对我来说不是解决方案
使用临时表而不是用户定义的表。它有助于避免错误,但性能仍然很差
更改整个代码(逻辑) - 不幸的是,这是我的方式。