例外ORA-06530:未初始化复合材料的参考

时间:2015-01-06 06:24:25

标签: oracle

我正在 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;

1 个答案:

答案 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;
/