René Nyffenegger's collection of things on the web
René Nyffenegger on Oracle - Most wanted - Feedback -
 

Returning a table with PL/SQL

create type o_ as object (
  street Varchar2(20),
  zip    Number(5),
  town   Varchar2(20)
);
/

create type t_ as table of o_;
/

create table tbPerson (
  personid  Number primary key,
  name      Varchar2(20),
  firstname Varchar2(20)
);

create table tbAddress (
  addressid Number,
  personid  references tbPerson,
  street    Varchar2(20),
  zip       Number(5),
  town      Varchar2(20),
  addresstype varchar2(4)
);


insert into tbPerson values (1,'Meier', 'Hans');
insert into tbPerson values (2,'Mueller','Juerg');

insert into tbAddress values(1, 1, 'Milchstrasse', 12345, 'Mars',           'Home');
insert into tbAddress values(2, 1, 'Plejaden'    , 54321, 'Alpha Centauri', 'Home');
insert into tbAddress values(3, 1, 'Sonnensyst.' , 44444, 'Saturn',         'Work');

insert into tbAddress values(4, 2, 'Park LN'     , 55555, 'St. Louis',      'Home');
insert into tbAddress values(5, 2, 'Main St'     , 66666, 'Chigaco',        'Home');



create or replace function getAddress
  (p_addressid number, p_address_type Varchar2) 
  return t_ as
  r t_ := t_();
begin

  select cast(multiset(select street, zip, town from tbAddress 
                  where addressid = p_addressid 
                    and addresstype = p_address_type) as t_)  into r from dual;

  return r;
end;
/


select * from table(getAddress(1,'Home'));

select p.personid, p.name, t.street, t.zip, t.town from
  tbPerson p, table(cast (getAddress(1, 'Home')) as t_) t 
  where p.firstname = 'Juerg';

drop table tbAddress;
drop table tbPerson;
drop function getAddress;
drop type t_;
drop type o_;