|
Posted on 2011-08-21 15:38 瘋狂 閱讀(1613) 評論(2) 編輯 收藏 所屬分類: database
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
-------------------------------------------------


評論
# re: oracle中的對象及測試 回復 更多評論
2011-08-22 17:20 by
不錯的開源。
# re: oracle中的對象及測試 回復 更多評論
2011-08-22 17:21 by
|