??? create
or
replace
type
person
as
object
??? ? (
??? ???
NAME
varchar2
(
10
),
??? ??? SEX
char
(
2
),
??? ??? BIRTHDATE
date
,
??? ??? PLACE
varchar2
(
100
),
??? ???
member
function
get_name
return
varchar2
??? ? )
not
final
;
--
必須注明,默認(rèn)為
final
??? create
or
replace
type
body
person
is
???
?
member
function
get_name
return
varchar2
is
??? ???
begin
??? ?????
return
self.name;
??? ???
end
get_name;
??? end ;
??? create
or
replace
type
employee
under
person
??? ? (
??? ??? emp_id
varchar2
(
10
),
??? ??? dep_id
varchar2
(
10
),
??? ??? job
varchar2
(
20
)
??? ? );
??? declare
??? ? person_one person;
??? ? employee_one employee;
??? begin
??? ? person_one:=person(
'
李四
'
,
'
男
'
,
date
'
??? ? employee_one:=employee(
'
小張
'
,
'
女
'
,
date
'
??? ? dbms_output.put_line(person_one.get_name);
??? ? dbms_output.put_line(employee_one.get_name);
??? end ;
??? declare
??? ? person_one person;
??? ? employee_one employee;
??? begin
??? ? person_one:=employee(
'
小張
'
,
'
女
'
,
date
'
??? ? employee_one:=person(
'
李四
'
,
'
男
'
,
date
'
??? ? dbms_output.put_line(person_one.name);
--
正確!
??? ? dbms_output.put_line(person_one.emp_id);
--
錯(cuò)誤,父類忽略子類參數(shù)!
??? end ;
??? create
or
replace
type
person
as
object
??? ? (
??? ???
NAME
varchar2
(
10
),
??? ??? SEX
char
(
2
),
??? ??? BIRTHDATE
date
,
??? ??? PLACE
varchar2
(
100
),
??? ???
member
procedure
show_msg
??? ? )
not
final
;
??? create
or
replace
type
body
person
is
???
?
member
function
show_msg
return
varchar2
is
??? ???
begin
??? ????? dbms_output.put_line(
name
||
'/'
||sex||
'/'
||birthdate);
??? ???
end
show_msg;
??? end ;
??? create
or
replace
type
employee
under
person
??? ? (
??? ??? emp_id
varchar2
(
10
),
??? ??? dep_id
varchar2
(
10
),
??? ??? job
varchar2
(
20
),
??? ??? overriding member procedure show_msg--關(guān)鍵字overriding
??? ? );
??? create
or
replace
type
body
employee
is
???
?
overriding
member
procedure
show_msg
is
??? ???
begin
??? ????? dbms_output.put_line(emp_id||
'/'
||dep_id||
'/'
||job);
??? ???
end
show_msg;
??? end ;
??? declare
??? ? person_one person;
??? ? employee_one employee;
??? begin
??? ? person_one:=person(
'
李四
'
,
'
男
'
,
date
'2008-10-20'
,
'
上海
'
);
??? ? employee_one:=employee(
'
小張
'
,
'
女
'
,
date
'2008-10-11'
,
'
杭州
'
,
'123456'
,
'11'
,
'22'
);
??? ? person_one.show_msg;
--
李四
/
男
/20-OCT-08
??? ? employee_one.show_msg;
--123456/11/22
??? end ;
??? declare
??? ? person_one person;
??? ? person_two person;
??? begin
??? ? person_one:=person(
'
李四
'
,
'
男
'
,
date
'
??? ? person_two:=employee(
'
小張
'
,
'
女
'
,
date
'
??? ? person_one.show_msg;
--
李四
/
男
/20-OCT-08
??? ? person_two.show_msg;
--12
??? end ;
??? create
or
replace
type
person
as
object
??? ? (
??? ???
NAME
varchar2
(
10
),
??? ??? SEX
char
(
2
),
??? ??? BIRTHDATE
date
,
??? ??? PLACE
varchar2
(
100
)
??? ? )
;
??? create table t_person of person; -- 注意格式!
??? insert
into
t_person
values
(
'
張三
'
,
'
男
'
,
date
'
??? insert
into
t_person
values
(person(
'
李四
'
,
'
男
'
,
date
'
??? SQL
>
select
*
from
t_person;
??? NAME
????
??? -------- ---- --------- --------
???
張三
??? ?
男
??
11
-OCT-
08
?
杭州
??? 李四 ?? ? 男 ?? 20 -OCT- 08 ? 上海
??? SQL
>
select
value
(a)
from
t_person a;
??? VALUE
(A)(
NAME
, SEX, BIRTHDATE, PLACE)
??? ----------------------------------------
??? PERSON(
'
張三
'
,
'
男
'
,
'11-OCT-08'
,
'
杭州
'
)
??? PERSON( ' 李四 ' , ' 男 ' , '20-OCT-08' , ' 上海 ' )
??? create
table
t_person_f(
??? ? emp_id
integer
,
??? ? emp_msg
ref
person
scope
is
t_person
??? ? );
??? insert
into
t_person_f
??? select
123
,
ref
(a)
from
t_person a
??? where a.name= ' 張三 ' ;
??? SQL
>
select
*
from
t_person_f;
--
無法查詢真實(shí)信息
??? ?EMP_ID????? EMP_MSG
??? ----------?? ----------------------------------------------
???
?
123
????????
??? SQL
>
select
emp_id,
deref
(emp_msg)
from
t_person_f;
??? ? EMP_ID????
DEREF
(EMP_MSG)(
NAME
, SEX, BIRTHDATE, PLACE)
??? ---------?? -------------------------------------------------
??? ?? 123 ?????? PERSON( ' 張三 ' , ' 男 ' , '11-OCT-08' , ' 杭州 ' )
??? delete from t_person where name = ' 張三 ' ; -- 刪除對(duì)象
??? SQL > select emp_id,deref(emp_msg) from t_person_f;
??? ? EMP_ID???? DEREF(EMP_MSG)(NAME, SEX, BIRTHDATE, PLACE)
??? ---------?? -------------------------------------------------
??? ?? 123??????
??? SQL
>?
select
emp_id
from
t_person_f
where
emp_msg
is
dangling
;
??? ??? EMP_ID
??? ----------
???? ????? 123