oracle中的对象及测试 (一)

2014-11-24 08:50:59 · 作者: · 浏览: 2

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 PARENTO