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_;