oracle8 发布的时候,数据库中就可以使用对象了,可以定义自己的类,也就是对象类型,和java里面的类相似,都可以包含构造函数,属性和方法。,对象类型有时候也成为用户自定义类型。以下是相关使用说明和测试:

/**/
/**/
/**/
/*
*
oracle对象实例及测试
*/
--
-(1)测试对象
create
or
replace
type PERSON
as
Object(
name
varchar2
(
100
),
sex
char
(
2
),
birth date,
pwd
varchar2
(
32
),
member
function
geName
return
varchar2
)
create
or
replace
type body PERSON
as
member
function
geName
return
varchar
is
begin
return
self.birth;
--
self表示当前对象如同java里面的this
end
;
end
;
--
(2)在plsql中使用对象
declare
tuser person;
begin
tuser :
=
person(
'
joe2
'
,
'
01
'
,sysdate,
'
123456
'
);
dbms_output.put_line(tuser.geName);
--
调用方法
end
;

--
-(3)在对象中使用构造函数,过程和静态属性和方法

/**/
/*
1 构造函数使用constructor声明
2 构造函数return self as result声明结尾,
3 构造函数属性不需要定义长度 eg:varchar2
static 不能用member声明
sttatic 不能声明属性,只能声明function和procedure
static 的方法和函数使用的时候直接用 对象类型.XX
*/
create
or
replace
type testm
as
OBJECT(
name
varchar2
(
10
),
sex
char
(
2
),
constructor
function
testm(
--
一个参数的构造函数
p_name
varchar2
)
return
self
as
result,
constructor
function
testm(
--
二个参数的构造函数
p_name
varchar2
,
p_sex
char
)
return
self
as
result,
member
function
getSex
return
char
,
static
function
getSexByCode(code
in
char
)
return
varchar2
,
member
procedure
getSexCN ,
static
procedure
getSexCNByCode(code
in
char
,
str
out
varchar2
)
);
create
or
replace
type body testm
is
constructor
function
testm(
--
一个参数的构造函数
p_name
varchar2
)
return
self
as
result
is
begin
self.name:
=
p_name;
return
;
end
;
constructor
function
testm(
--
一个参数的构造函数
p_name
varchar2
,
p_sex
char
)
return
self
as
result
is
begin
self.name:
=
p_name;
self.sex:
=
p_sex;
return
;
end
;
member
function
getSex
return
char
as
begin
return
self.sex;
end
getSex;
member
procedure
getSexCN
as
begin
if
self.sex
=
'
01
'
then
dbms_output.put_line(
'
男
'
);
else
dbms_output.put_line(
'
女
'
);
end
if
;
end
getSexCN;
static
function
getSexByCode(code
in
char
)
return
varchar2
as
begin
if
code
=
'
01
'
then
return
'
男
'
;
elsif code
=
'
02
'
then
return
'
女
'
;
else
return
'
中性
'
;
end
if
;
end
getSexByCode;
static
procedure
getSexCNByCode(code
in
char
,
str
out
varchar2
)
as
begin
if
code
=
'
01
'
then
str
:
=
'
男
'
;
elsif code
=
'
02
'
then
str
:
=
'
女
'
;
else
str
:
=
'
中性
'
;
end
if
;
end
getSexCNByCode;
end
;
--
测试
declare
obj testm;
sexstr
varchar2
(
4
);
begin
obj :
=
testm(
'
01
'
);
dbms_output.put_line(obj.getSex);
obj.getSexCN;
dbms_output.put_line(testm.getSexByCode(
'
03
'
));
testm.getSexCNByCode(
'
03
'
,sexstr);
dbms_output.put_line(sexstr);
end
;
--
------------------------------
--
(4)类型继承---------------------------

/**/
/**/
/**/
/*
使用 under标示
被继承的对象必须定义为 NOT FINAL
如果类型仅仅作为超类,不被实例化(类似于java中的abstract)定义为:not instantiable
*/
create
or
replace
type PARENTOBJ
as
Object(
name
varchar2
(
100
),
sex
char
(
2
),
member
function
geName
return
varchar2
)
NOT
FINAl;
create
type body PARENTOBJ
is
member
function
geName
return
varchar2
as
begin
return
self.name;
end
;
end
;
create
or
replace
type SUB_OBJ under PARENTOBJ(
birth date
)
--
测试
declare
obj SUB_OBJ;
begin
obj :
=
SUB_OBJ(
'
joe2
'
,
'
01
'
,sysdate);
dbms_output.put_line(obj.geName);
--
调用继承的方法,和继承的属性
end
;
--
-------------------------------------
--
(5)重写------------------------------

/**/
/**/
/**/
/*
重写方法和过程需要在声明和body里面声明为overriding
*/
create
or
replace
type SUB_OBJ2 under PARENTOBJ(
birth date,
overriding member
function
geName
return
varchar2
--
重写父类的方法
)
create
or
replace
type body SUB_OBJ2
is
member
function
geName
return
varchar2
as
begin
return
'
我的名字是:
'
||
self.name;
end
;
end
;
--
测试
declare
obj SUB_OBJ2;
begin
obj :
=
SUB_OBJ2(
'
joe2
'
,
'
01
'
,sysdate);
dbms_output.put_line(obj.geName);
--
调用继承的方法,和继承的属性
end
;
--
(6)使用对象定义表中的列----------
create
table
test00(
tuser person,
remark
varchar2
(
100
)
) 
--
insert into test00 values(person('joe','01',sysdate,'123456'),/*参数个数必须够*/'remarkcontent');
--
select t.tuser.name from test00 t;--必须使用表别名
--
delete from test00 t where t.tuser.name='joe';
--
--------------------------------------------
--
(7)使用对象定义整个表
create
table
testoo1
of
person;
--
insert into testoo1 values(person('joe2','01',sysdate,'123456'));
--
select t.* from testoo1 t;
--
delete from testoo1 where name='joe';
--
----------------------------------------------
--
(8)对象引用,每一列都是目标表中的列的引用
create
table
testoo2(
id
number
primary
key
,
tuesr ref person scope
is
testoo1
)
--
insert into testoo2 values(1,(select ref(oo1) from testoo1 oo1 where oo1.name='joe'));
--
update testoo2 o2 set o2.tuesr=(select ref(oo1) from testoo1 oo1 where oo1.name='joe2') where o2.id=1
--
-----------------------------------------------
本文深入探讨了Oracle数据库中对象类型的定义、使用方法,包括构造函数、属性、方法等核心概念,并通过实例展示了如何在PL/SQL环境中创建、使用和测试对象类型。此外,文章还介绍了类型继承、重写方法、使用对象定义表列和表等高级特性。
394

被折叠的 条评论
为什么被折叠?



