Если вам нужна переменная коллекции - вы можете использовать вложенную таблицу и массовый сбор, как показано ниже. Чтобы иметь возможность вернуть значение из процедуры, вам нужно будет объявить тип вложенной таблицы в каком-либо пакете или на уровне схемы БД.
declare
type test_type is table of varchar2(2000);
test_collection test_type;
begin
select distinct(name) bulk collect into test_collection
from (
select 1 id, 'AAA' name from dual
union all
select 1 id, 'BBB' name from dual
union all
select 1 id, 'AAA' name from dual
union all
select 2 id, 'CCC' name from dual
)
where id = 1;
for i in test_collection.first..test_collection.last loop
dbms_output.put_line(test_collection(i));
end loop;
end;
/
Если вам просто нужна строка с конкатенированными значениями - вы можете использовать listagg, чтобы создать его, как показано ниже
declare
test_str varchar2(4000);
begin
select listagg(name, ', ') within group(order by 1)
into test_str
from (
select distinct name
from (
select 1 id, 'AAA' name from dual
union all
select 1 id, 'BBB' name from dual
union all
select 1 id, 'AAA' name from dual
union all
select 2 id, 'CCC' name from dual
)
where id = 1
);
dbms_output.put_line(test_str);
end;
/