PIPELINED . , ( , ). . .
, ( , sys_refcursor, ..).
set echo on
set serveroutput on
drop table people;
create table people
(
pid number primary key,
name varchar2(100),
address varchar2(100),
city varchar2(100),
state varchar2(2)
);
insert into people values (1, 'John Smith', '123 Main St', 'Denver', 'CO');
insert into people values (2, 'Jane Doe', '456 West St', 'Ft Lauderdale', 'FL');
insert into people values (3, 'Pete Rose', '789 North Ave', 'Philadelphia', 'PA');
commit;
:
create or replace package refcur_pkg is
type people_tab is table of people%rowtype;
end refcur_pkg;
create or replace type pid_tab as table of number;
( - )
create or replace function get_people(pids in pid_tab)
return refcur_pkg.people_tab pipelined
IS
v_people_row people%rowtype;
begin
if (pids is null or pids.count = 0) then
for rec in (select * from people)
loop
pipe row(rec);
end loop;
else
for rec in (select * from people where pid in (select * from table(pids)))
loop
pipe row(rec);
end loop;
end if;
end;
select * from table(get_people(new pid_tab(1,3,4,5)));
select * from table(get_people(new pid_tab(-1)));
select * from table(get_people(new pid_tab()));
select * from table(get_people(NULL));