Тип должен быть объявлен где-то, на что могут ссылаться как A, так и B. Одним из вариантов будет объявление типа в пакете, т.е.
SQL> create package some_pkg
2 as
3 type t_list is table of varchar2(10);
4
5 procedure procedureA;
6 procedure procedureB( p_list OUT t_list );
7 end;
8
9 /
Package created.
SQL> create or replace package body some_pkg
2 as
3 procedure procedureA
4 as
5 l_list t_list;
6 begin
7 procedureB( l_list );
8 dbms_output.put_line( l_list.count );
9 end;
10
11 procedure procedureB
12 ( p_list OUT t_list )
13 as
14 begin
15 select ename
16 bulk collect into p_list
17 from emp;
18 end;
19 end;
20 /
Package body created.
SQL> exec some_pkg.procedureA;
16
PL/SQL procedure successfully completed.
Другой вариант - объявить тип в SQL, т. Е.
SQL> create type t_list
2 as table of varchar2(10);
3 /
Type created.
SQL> ed
Wrote file afiedt.buf
1 create or replace procedure procedureB( p_list OUT t_list )
2 as
3 begin
4 select ename
5 bulk collect into p_list
6 from emp;
7* end;
SQL> /
Procedure created.
SQL> create or replace procedure procedureA
2 as
3 l_list t_list;
4 begin
5 procedureB( l_list );
6 dbms_output.put_line( l_list.count );
7 end;
8 /
Procedure created.
SQL> exec procedureA;
16
PL/SQL procedure successfully completed.