ORA-6530错误求助:初始化复合类型后仍报未初始化引用
ORA-6530: reference to uninitialized composite 错误解决
问题场景
用户创建了以下对象类型与存储过程:
create or replace type rec_int_g as object ( i integer); create or replace type typ_int_g is table of rec_int_g; Procedure iparse(v_str in varchar2, t_int out NOCOPY typ_int_g) is /* parsing procedure for blank divided string */ str varchar2(4000); int_array typ_int_g; i pls_integer := 1; pos pls_integer := 1; begin int_array := typ_int_g(); str := norm(v_str); /* normalize string excluding symbols */ while pos > 0 loop pos := instr(str, ' '); int_array.extend(); if pos > 0 then int_array(i).i := to_number(trim(substr(str, 1, pos)));
调用代码:
declare arr typ_int_g; begin search.iparse('1 2 3 4 5',arr); end;
执行时在int_array(i).i := to_number(trim(substr(str, 1, pos)));行触发ORA-6530 reference to uninitialized composite错误,用户已初始化表类型但仍报错。
错误原因
你虽然初始化了表类型int_array := typ_int_g();,并且用int_array.extend()扩展了表的长度,但表中每个位置的rec_int_g对象实例并未初始化。直接访问int_array(i).i相当于引用一个未初始化的复合对象,因此触发ORA-6530错误。
解决方案
在int_array.extend()之后,需要为每个表元素创建rec_int_g对象实例,同时补全存储过程的剩余逻辑(比如截取剩余字符串、递增索引、处理最后一个无空格的元素,以及将结果赋值给输出参数)。修正后的存储过程如下:
create or replace Procedure iparse(v_str in varchar2, t_int out NOCOPY typ_int_g) is /* parsing procedure for blank divided string */ str varchar2(4000); int_array typ_int_g; i pls_integer := 1; pos pls_integer := 1; begin int_array := typ_int_g(); str := norm(v_str); /* normalize string excluding symbols */ while pos > 0 loop pos := instr(str, ' '); int_array.extend(); -- 初始化当前位置的rec_int_g对象实例 int_array(i) := rec_int_g(null); if pos > 0 then int_array(i).i := to_number(trim(substr(str, 1, pos - 1))); -- 截取剩余字符串 str := substr(str, pos + 1); else -- 处理最后一个没有空格的元素 if length(trim(str)) > 0 then int_array(i).i := to_number(trim(str)); end if; end if; i := i + 1; end loop; -- 将结果赋值给输出参数 t_int := int_array; end;
关键修正点
- 在
int_array.extend()后添加int_array(i) := rec_int_g(null);,显式初始化每个表元素的对象实例 - 修正
substr(str, 1, pos)为substr(str, 1, pos - 1),避免截取到空格 - 补充剩余字符串的截取逻辑,确保循环能处理所有元素
- 添加最后一个元素的处理分支(当pos=0时,处理字符串剩余部分)
- 最后将
int_array赋值给输出参数t_int,确保调用方能获取结果
内容的提问来源于stack exchange,提问作者Dmytro
相关产品推荐
相关产品推荐

