我正在 error message
Exception ORA-06530: Reference to uninitialized composite
我创建的对象类型很少 - 它具有复合集合类型
create TYPE obj1 IS OBJECT
(vn_count_num NUMBER,
vv_data VARCHAR2(10000));
create TYPE tab1 IS TABLE OF obj1;
create TYPE obj2 IS OBJECT
(num NUMBER,
obj1 tab1);
create TYPE tab2 IS TABLE OF obj2;
得到异常ORA-06530:引用未初始化的复合词 在运行下面的区块时。
成功运行以下块需要做什么
declare
--var1 tab1 := tab1();
var2 tab2 := tab2();
begin
DBMS_OUTPUT.PUT_LINe('Start ');
--var2.obj1 := tab1();
var2.extend;
var2(1).obj1 := tab1();
var2(1).num:=1;
var2(1).obj1.extend;
var2(1).obj1(1).vn_count_num:=1;
var2(1).obj1(1).vv_data:='Data';
DBMS_OUTPUT.PUT_LINe('End ');
exception
when others then
DBMS_OUTPUT.PUT_LINe('Exception '||SQLERRM);
end;
答案 0 :(得分:2)
extend
的调用会向数组添加另一个条目(或插槽,如果可以),但此条目的值为null。因此,var2(1).num := 1
实际上是cast (null as obj2).num := 1
,它会引发您所获得的豁免。
为了使脚本有效,您必须使用初始化值明确填充该条目,例如:
declare
var1 tab1 := tab1();
var2 tab2 := tab2();
begin
DBMS_OUTPUT.PUT_LINe('Start ');
--var2:=tab2();
--var1:=tab1();
var2.extend;
var2(1) := obj2(null, null); -- ADD THIS and...
var2(1).num:=1;
var1.extend;
var1(1) := obj1(null, null); -- ...THIS too
var1(1).vn_count_num:=1;
var1(1).vv_data:='Data';
var2(1).obj1:=var1;
DBMS_OUTPUT.PUT_LINe('End ');
exception
when others then
DBMS_OUTPUT.PUT_LINe('Exception '||SQLERRM);
end;
/