Oracle程序太大(codegen操作数)错误
Oracle程序太大(codegen操作数)错误,oracle,codegen,Oracle,Codegen,我想在Oracle中从数千个点构建形状,但是在运行创建的代码时,我得到了错误: ORA-06550:程序太大(codegen操作数) 我达到了什么极限?我如何克服它? 复制错误的类似代码(在一分钟内运行或失败): 看来,批量收集可以解决这个问题。以下代码的运行时间延长了10倍,但没有给出错误: declare s clob; begin s := ' declare type t_x is table of number index by pls_integer;
我想在Oracle中从数千个点构建形状,但是在运行创建的代码时,我得到了错误:
ORA-06550:程序太大(codegen操作数) 我达到了什么极限?我如何克服它?
复制错误的类似代码(在一分钟内运行或失败):
看来,批量收集可以解决这个问题。以下代码的运行时间延长了10倍,但没有给出错误:
declare
s clob;
begin
s := '
declare
type t_x is table of number index by pls_integer;
x t_x;
varr sdo_ordinate_array;
begin
select coord
bulk collect into x
from (';
for i in 1..23000 loop --21825: ok, 21850: error
s := s || 'select '||to_char(i)||' rn, 46.709864 + '||to_char(i)||'/23000 coord from dual union all'||chr(10);
end loop;
s := s || '
select null,null from dual
)
where rn is not null
order by rn;
varr := sdo_ordinate_array();
varr.extend(x.count);
for i in 1 .. x.count loop
varr(i) := x(i);
end loop;
end;';
execute immediate s;
end;
是否有理由将所有内容都放在一个动态语句中?看起来真的很奇怪 请尝试与此类似的方法:
declare
varr sdo_ordinate_array;
begin
varr := sdo_ordinate_array();
for i in 1..23000 loop
varr.extend;
varr(i) := 46.709864 + i/23000;
end loop;
end;
我不知道您的实际代码,但您也可以从executeimmediate返回值,如本例所示。也许它可以简化你的问题
DECLARE
type t_x is table of number index by pls_integer;
x t_x;
str varchar2(100);
BEGIN
FOR i in 10..20 LOOP
str := i|| ' * 2';
EXECUTE IMMEDIATE 'BEGIN :ret := '||str||'; END;' USING OUT x(i);
dbms_output.put_line(x(i));
END LOOP;
END;
对于10g,如果这些参数被破坏,则可能导致该消息。是的,我也找到了这个。但是它们中的哪一个与上面的问题有关呢?所有东西都放在clob中的原因是数组的每个元素都有不同的坐标。这些都在一个文件中,上面的代码是模拟原始问题的最简单形式。最初的问题是clob中的代码。如果您真的需要它(我仍然怀疑),那么您必须将代码拆分为几个包。您仍然使用Oracle 10g吗?在较新的版本中,几乎不可能超过限制。这个问题出现在12c上。但我只需要一个匿名plsql块来加载数据。下面的代码(使用批量收集)解决了这个问题。
DECLARE
type t_x is table of number index by pls_integer;
x t_x;
str varchar2(100);
BEGIN
FOR i in 10..20 LOOP
str := i|| ' * 2';
EXECUTE IMMEDIATE 'BEGIN :ret := '||str||'; END;' USING OUT x(i);
dbms_output.put_line(x(i));
END LOOP;
END;