Ошибка при назначении значений для записей внутри коллекции - PullRequest
0 голосов
/ 29 апреля 2019

Мне нужно перебрать некоторые значения внутри кода plsql.поэтому пытаюсь создать коллекцию записей.получить ошибку, как указано ниже.Пожалуйста, помогите мне решить

-- please see the code below  


    declare 
    type tab_name is record  (t_name varchar2(30),col_name varchar2(30));
    type tab_list is table of tab_name;
    table_names tab_list:=tab_list(tab_name('ABC','abc'),tab_name('XYZ','xyz'));
    begin
    for i in table_names.first..table_names.last loop
    dbms_output.put_line(table_names(i).t_name||'-'||table_names(i).col_name);
    end loop;
    end;
    /




    Error report -
    ORA-06550: line 4, column 32:
    PLS-00222: no function with name 'TAB_NAME' exists in this scope
    ORA-06550: line 4, column 13:
    PL/SQL: Item ignored
    ORA-06550: line 6, column 10:
    PLS-00320: the declaration of the type of this expression is incomplete or malformed
    ORA-06550: line 6, column 1:
    PL/SQL: Statement ignored
    06550. 00000 -  "line %s, column %s:\n%s"
    *Cause:    Usually a PL/SQL compilation error.
    *Action:

1 Ответ

1 голос
/ 29 апреля 2019

Имя типа записи не является его инициализатором. На самом деле, в Oracle нет функции, подобной инициализации для типов записей:

Документация

Обратите внимание, что значения присваиваются отдельно каждому полю записи в Пример 5-47. Вы не можете назначить список значений записи, используя оператор присваивания. Нет конструкторской нотации для записи.

Вы должны создать каждый объект отдельно, а затем создать коллекцию с ними:

declare 
    type tab_name is record  (t_name varchar2(30),col_name varchar2(30));
    type tab_list is table of tab_name;

    name_1 tab_name;

    table_names tab_list;
begin
   name_1.t_name := 'ABC';
   name_1.col_name := 'abc';
   table_names := tab_list();
   table_names.extend;
   table_names(table_names.last) := name_1;
   name_1.t_name := 'XYZ';
   name_1.col_name := 'xyz';
   table_names.extend;
   table_names(table_names.last) := name_1;

    for i in table_names.first..table_names.last 
    loop
        dbms_output.put_line(table_names(i).t_name||'-'||table_names(i).col_name);
    end loop;
end;

Коллекции имеют инициализаторы. Однако в вашем случае у вас есть набор типов записей, поэтому вам придется предварительно создавать записи, чтобы использовать их.

...