疯狂

STANDING ON THE SHOULDERS OF GIANTS
posts - 481, comments - 486, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

oracle中的对象及测试

Posted on 2011-08-21 15:38 疯狂 阅读(1611) 评论(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 charreturn 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 charreturn 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 varchar2as
    
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 站长工具
http://tool.zbole.com/

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问