create table t1 as select level as id, 'some name ' || level as name from dual connect by level < 100;
create type o1 as object (id number, name varchar2(10));
create type c1 as table of o1;
Есть два варианта:
1create or replace function f1
return c1
pipelined
as
begin
for i in
(
select id, name
from t1
)
loop
pipe row (o1(i.id, i.name));
end loop;
end;
2create or replace function f2
return c1
as
c c1;
begin
select o1(id, name)
bulk collect into c
from t1;
return c;
end;
по-вашему, который лучше?