2013-03-06 113 views
2

我有以下类型定义成包PLSQL未初始化的集合

type column_info is record (col_name varchar2(20), col_value varchar2(1000)); 
type c_info is varray(10) of column_info; 
type table_info is record (table_name varchar2(20), col_info c_info); 

的规格在声明部分封装体我在包装体的主体我有

t_info table_info; 

在过程内部的

t_info:=null; 
t_info.table_name:='gl_temp_report1'; 
t_info.col_info(1).col_name:='table_idx'; 
t_info.col_info.extend; 
t_info.col_info(2).col_name:='table_row'; 
t_info.col_info.extend; 
t_info.col_info(3).col_name:='table_row_detail'; 

偶数包编译成功,在运行时我得到异常ORA-06531:Re对未初始化的收集。
我如何初始化col_info集合? 我试图初始化t_info.col_info(),但我得到了“没有功能”像这样。 TIA,Aurel

+0

http://ora-06531.ora-code.com/并阅读帖子底部,这可能会帮助你。 – 2013-03-10 04:16:39

回答

3

您应该在访问它们之前正确初始化所有集合(包括嵌套)。
它们在初始化之前是原子上的空值。

t_info := table_info('gl_temp_report1', c_info()); 

您还必须调用extend每个VARRAY元素赋值之前(或​​一次延长)。
还是做这一切在一个声明:

t_info := table_info('gl_temp_report1', c_info('table_idx','table_row','table_row_detail')); 
+0

我得到了“这个范围内没有名称为'TABLE_INFO'的函数 – user1540471 2013-03-06 19:36:52

+0

@ user1540471 - 对不起,我忘记了与对象不同的记录,没有方便的构造函数,记录的每个字段都应该单独初始化't_info .table_name:='gl_temp_report1';''''和't_info.col_info:= c_info();' – 2013-03-06 20:43:02

3

要执行初始化,您需要一个初始化块添加到包体,在类似如下的方式:

CREATE OR REPLACE PACKAGE BODY your_package IS 
    t_info table_info; 

    -- Whatever other procedure definitions, etc, are needed 

BEGIN -- package initialization 
    t_info.table_name:='gl_temp_report1'; 
    t_info.col_info := c_info(); 
    t_info.col_info.extend; 
    t_info.col_info(1).col_name:='table_idx'; 
    t_info.col_info.extend; 
    t_info.col_info(2).col_name:='table_row'; 
    t_info.col_info.extend; 
    t_info.col_info(3).col_name:='table_row_detail'; 
EXCEPTION 
    WHEN OTHERS THEN 
    DBMS_OUTPUT.PUT_LINE('Exception!'); -- Add whatever error handling is needed 
END your_package; 

分享享受。

0

如图所示,您可以创建T_Info中

declare 
type column_info is record (col_name varchar2(20), col_value varchar2(1000)); 
    type c_info is varray(10) of column_info; 
    type table_info is record (table_name varchar2(20), col_info c_info); 
    t_info table_info; 
begin 
    t_info.table_name := null; 
    t_info.col_info := c_info(); 
    for i in 1..10 loop 
    t_info.col_info.extend; 
    t_info.col_info(i).col_name := null; 
    t_info.col_info(i).col_value := null; 
    end loop; 
end; 
/

干杯!

+0

这不起作用,存在语法错误,这些构造函数不能与RECORD一起使用。 – 2014-04-26 07:30:57