Как передать вложенную таблицу из пакета в процедуру? Ошибка: PLS-00488: должен быть типом

В спецификации пакета объявлена коллекция с фиксированный набором значений:

create or replace PACKAGE CATEGORYS_MONITORING IS
    
    TYPE t_rec is table of varchar2(200 byte);
    t_categorys t_rec:=t_rec('Beverages General','Beauty General');
    
    PROCEDURE GENERATE_ROWS(l_category_name varchar2);
end CATEGORYS_MONITORING;

Надо передать коллецию подпрограмме, которая после проверки запустит процедуру:

declare
    subtype trep is CATEGORYS_MONITORING.t_categorys;
    CA1 CATEGORYS_MONITORING.t_categorys;
    CA2 trep;
begin
    for iter in CA2.first .. CA2.last
    loop
        IF CA2(iter)='Beverages General' THEN 
            CATEGORYS_MONITORING.GENERATE_ROWS(CA2(iter));
        END IF;
    end loop;
end;

Ошибка:PLS-00488:'CATEGORYS_MONITORING.T_CATEGORYS' должен быть типом.

Так как типы, между собой не совместимы, использовал subtype и к t_categorys, но всё равно ошибка.


Ответы (1 шт):

Автор решения: 0xdb

Что надо делать, если ошибка не совсем понятна? Надо создать пример, где ошибка воспроизводится, и упрощать его, пока причина ошибки не станет очевидной (или не исчезнет).

Упрощённо то, что в вопросе:

declare
    type t is table of varchar2(8);
    a t := t ('aaa','bbb');
    subtype subt is a;
begin null;
end;
/
ORA-06550: line 4, column 21:
PLS-00488: 'A' must be a type
  • а - это то, что содержит коллекция, или сущность коллекции
  • t - это то, что только определяет, что может содержать коллекция, или тип коллекции

То есть, когда поймёте разницу, получится:

declare
    type t is table of varchar2(8);
    a t := t ('aaa','bbb');
    subtype subt is t;
    b subt := a; 
begin null;
end;
/
PL/SQL procedure successfully completed.
→ Ссылка