2013-03-06 4 views
0

В мой пакет спецификаций я ставлю:PLSQL вложенные таблицы

type table_info is record (table_name varchar2(20), col_info c_info); 

В декларации зоны моего тела у меня есть:

t_info table_info := table_info(); 

Когда я компилирую я получаю:

Error: PLS-00222: no function with name 'TABLE_INFO' exists in this scope

Какая ошибка?

ответ

1

Вам не нужно инициализировать переменную типа записи:

SQL> DECLARE 
    2  TYPE typ_rec IS RECORD (a NUMBER, b NUMBER); 
    3  rec typ_rec; 
    4 BEGIN 
    5  rec.a := 1; 
    6  rec.b := 2; 
    7  dbms_output.put_line(rec.a + rec.b); 
    8 END; 
    9/

3 

PL/SQL procedure successfully completed 

Если вы используете вложенную таблицу записей однако, необходимо инициализировать коллекцию:

SQL> DECLARE 
    2  TYPE typ_rec IS RECORD (a NUMBER, b NUMBER); 
    3  TYPE typ_tab IS TABLE OF typ_rec; 
    4  tab typ_tab := typ_tab(); -- initialization 
    5 BEGIN 
    6  tab.extend; 
    7  tab(1).a := 1; 
    8  tab(1).b := 2; 
    9  dbms_output.put_line(tab(1).a + tab(1).b); 
10 END; 
11/

3 

PL/SQL procedure successfully completed 

You могут смешивать типы записей и типы сбора (нет необходимости инициализировать varrays):

SQL> DECLARE 
    2  TYPE column_info IS RECORD(
    3  col_name VARCHAR2(20), 
    4  col_value VARCHAR2(1000) 
    5 ); 
    6  TYPE c_info IS VARRAY(10) OF column_info; 
    7  TYPE table_info IS RECORD(
    8  table_name VARCHAR2(20), 
    9  col_info c_info 
10 ); 
11  l_table table_info; 
12 BEGIN 
13  l_table.table_name := 'TABLE_NAME'; 
14  l_table.col_info.extend; 
15  l_table.col_info(1).col_name := 'COL_NAME'; 
16  l_table.col_info(1).col_value := 'COL_VALUE'; 
17 END; 
18/

PL/SQL procedure successfully completed 

Для дальнейших чтение: PL/SQL collection documentation

+0

Как вы можете видеть, вторым элементом этой накладки является тип коллекции column_info - это запись (col_name varchar2 (20), col_value varchar2 (1000)); Тип c_info - это varray (10) of column_info; Когда я присваиваю значение col_value, например: t_info.col_info (1) .col_name: = 'table_idx'; Я получаю ORA-06531: Ссылка на неинициализированную коллекцию – user1540471

+0

Измените свой вопрос вместо добавления комментариев в комментарии. –

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