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/ и читать сообщения внизу, это может помочь вам. –

ответ

3

Перед доступом к ним вы должны инициализировать все коллекции (включая вложенные).
Они являются атомарными нулями перед инициализацией.

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

Вы также должны вызвать extend перед присвоением значения для каждого элемента VARRAY (или продлить один раз extend(3)).
Или все это в одном заявлении:

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

Я получаю «нет функции с именем« TABLE_INFO »в этой области – user1540471

+0

@ user1540471 - Извините, я забыл, что записи, в отличие от объектов, не имеют удобного конструктора. Каждое поле записи должно быть инициализировано отдельно.' T_info .table_name: = 'gl_temp_report1'; 'и' t_info.col_info: = c_info(); ' –

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. –

Смежные вопросы