oracle 面向对象测试

59 篇文章 0 订阅
关系数据库在不断地发展时,许多数据库引入了面向对象的思想,这其中以Oracle为代表,Oracle9i就号称面向对象数据库。 自Oracle9i以来,Oracle就不再是单纯的关系数据库管理系统,它在关系数据库模型的基础上,添加了一系列面向对象的特性。Oracle的对象体系遵从面向对象思想的基本特征,许多概念同C++,JAVA中类似,具有继承,重载,多态等特征,但又有自己的特点。

1、 Oracle面向对象的最基本元素是它的对象类型——Type。
下面开始写自定义对象类型( as object 必须关键字)
Java代码   收藏代码
  1.  create or replace type ADDRESS as  object  
  2.   (  
  3.       PROVINCE varchar(10 ),  
  4.       CITY varchar(20 ),  
  5.       STREET varchar(30 )  
  6.  );   
  7. 创建表并使用以上对象类型ADDRESS   
  8.  create table  STUDENTOBJ   
  9.   (  
  10.      STUNAME varchar(20 ),  
  11.       STUADD  ADDRESS  
  12.   );  
 create or replace type ADDRESS as  object
  (
      PROVINCE varchar(10 ),
      CITY varchar(20 ),
      STREET varchar(30 )
 ); 
创建表并使用以上对象类型ADDRESS 
 create table  STUDENTOBJ 
  (
     STUNAME varchar(20 ),
      STUADD  ADDRESS
  );

 
  向表中插入数据:
insert into STUDENTOBJ values('improviser',ADDRESS('广东省','广州市','江海大道');
通过别名对表进行查询
select  S.STUNAME S.ADDRESS.PROVINCE S.ADDRESS.CITY
S.ADDRESS.STREET  from  STUDENTOBJ S;
从上面的测试代码,可以很容易看到其与面向对象语言(比如Java)的差异,不必使用new创建实例,也没有了默认无参数构造器,默认使用定义的属性作为构造器参数,足以描述各种实体。另外,Type的属性没有private,protected,public的说法,所有的属性调用者都可以访问,即都是public。

2、Oracle中面向对象特征——继承(父类型必须声明为NOT FINAL,子类型使用关键字UNDER)
Java代码   收藏代码
  1. 1  创建父类型  
  2.  create or replace type PERSON as  object  
  3.   (  
  4.      PERNAME varchar(10 ),  
  5.      PERSEX varchar(2 )  
  6.  )not  final;  
  7.     
  8.   子类型继承父类型  
  9.  create or replace  type STUDENT under PERSON  
  10.  (  
  11.     STUNO varchar(8 ),  
  12.     STUSCORE varchar(10 )  
  13.  );  
 1  创建父类型
  create or replace type PERSON as  object
   (
      PERNAME varchar(10 ),
      PERSEX varchar(2 )
  )not  final;
   
   子类型继承父类型
  create or replace  type STUDENT under PERSON
  (
     STUNO varchar(8 ),
     STUSCORE varchar(10 )
  );


由以上定义,其子类型中属性包含了父类型中所有属性。

3、可变数组
可变数组,是一种集合。一个可变数组是对象的一个集合,其中每个对象都具有相同的数据类型。可变数组的大小由创建时决定。在表中建立可变数组后,可变数组在主表中作为一个列对待。
Java代码   收藏代码
  1.   创建对象类型  
  2.  create or replace type ADDRESS as  object  
  3.   (  
  4.      PROVINCE varchar(10 ),  
  5.      CITY varchar(20 ),  
  6.   );  
  7.     
  8.   创建ADDRESS可变数组  
  9.  create or replace type ADDRESS_LIST as varray(3) of  ADDRESS;  
  10.    
  11.  创建表并使用可变数组ADDRESS_LIST  
  12. create table  STUDENT   
  13.  (  
  14.     STUNAME varchar(20 ),  
  15.      STUADDS ADDRESS_LIST  
  16.  );  
  17.    
  18.  向表中插入数据  
  19. insert into STUDENT values('improviser',ADDRESS_LIST(ADDRESS('广东省','广州市','江海大道' ),  
  20.                                           ADDRESS( ' 广东省 ' , ' 潮州市 ' , ' 潮枫路 ' )));  
  21.    
  22.  查询(使用table函数将数据表格形式输出)  
  23. select *from table(select s.STUADDS from STUDENT where STUNAME='improviser');   
   创建对象类型
  create or replace type ADDRESS as  object
   (
      PROVINCE varchar(10 ),
      CITY varchar(20 ),
   );
   
   创建ADDRESS可变数组
  create or replace type ADDRESS_LIST as varray(3) of  ADDRESS;
  
  创建表并使用可变数组ADDRESS_LIST
 create table  STUDENT 
  (
     STUNAME varchar(20 ),
      STUADDS ADDRESS_LIST
  );
  
  向表中插入数据
 insert into STUDENT values('improviser',ADDRESS_LIST(ADDRESS('广东省','广州市','江海大道' ),
                                           ADDRESS( ' 广东省 ' , ' 潮州市 ' , ' 潮枫路 ' )));
  
  查询(使用table函数将数据表格形式输出)
 select *from table(select s.STUADDS from STUDENT where STUNAME='improviser'); 

4、嵌套表
嵌套表是表中之表,一个嵌套表是某些行的集合,它在主表中表示为其中的一列。对主表中的每一条记录,嵌套表可以包含多个行。
Java代码   收藏代码
  1. 1  定义嵌套表方法:  
  2.   create or replace type ADDRESS_TABLE as table of ADDRESS;  
  3.      
  4.    基本对象类型、创建表、查询和插入数据都跟上面可变数组一样  
  5.      
  6.   嵌套表更新(table转化为表再利用表别名操作列进行更新)  
  7.   update table(select S.STUADDS from STUDENT S where   
  8.      S.STUNAME  =   ' improviser ' ) AD set  AD.PROVINCE  =   ' 北京 '   where  city  =   ' 广州 ' ;  
  9.     
  10.  删除嵌套表记录  
  11.  delete   from   table ( select  S.STUADDS  from  STUDENT S   
  12.    where  S.STUNAME  =   ' improviser ' ) AD where  AD.city  =   ' 潮州 市' ;  
1  定义嵌套表方法:
  create or replace type ADDRESS_TABLE as table of ADDRESS;
   
   基本对象类型、创建表、查询和插入数据都跟上面可变数组一样
   
  嵌套表更新(table转化为表再利用表别名操作列进行更新)
  update table(select S.STUADDS from STUDENT S where 
     S.STUNAME  =   ' improviser ' ) AD set  AD.PROVINCE  =   ' 北京 '   where  city  =   ' 广州 ' ;
  
 删除嵌套表记录
 delete   from   table ( select  S.STUADDS  from  STUDENT S 
   where  S.STUNAME  =   ' improviser ' ) AD where  AD.city  =   ' 潮州 市' ;



    比较:可变数组,查询速度快,但是更新困难得整体更新,适用与数据不修改情况,如医生处方。使用嵌套表可以对表中的表内容进行修改而无需进行整体更新操作。

4、对象表

Java代码   收藏代码
  1.   首先创建对象类型  
  2.  create or replace type OFFICETYPE as  object  
  3.   (  
  4.      id varchar(10 ),  
  5.      typename varchar(20 )  
  6.   );  
  7.     
  8.   将对象类型转化为对象表  
  9.  create table office of  officetype;  
  10.    
  11.  创建对象关系表(使用ref ,指示OID进行对象表关联)  
  12. create table  worker  
  13.  (  
  14.     workerid varchar(10) primary key ,  
  15.     workername varchar(20 ),  
  16.     workeroffice ref officetpey scope is  office,  
  17.     phone varchar(20 )  
  18.  );  
  19.    
  20.  使用deref 取得关联对象表相关内容  
  21. select workerid,workername,deref(w.workeroffice),phone from  worker w   
  22.   where  workerid  =   ' C001 ' ;  
  23.  结果为  
  24. C001   张小明  OFFICETYPE('0001''财务科')      010-12345   
  25.    
  26.  使用VALUE(别名)查询对象内容  
  27. select value(o) from  office o;  
   首先创建对象类型
  create or replace type OFFICETYPE as  object
   (
      id varchar(10 ),
      typename varchar(20 )
   );
   
   将对象类型转化为对象表
  create table office of  officetype;
  
  创建对象关系表(使用ref ,指示OID进行对象表关联)
 create table  worker
  (
     workerid varchar(10) primary key ,
     workername varchar(20 ),
     workeroffice ref officetpey scope is  office,
     phone varchar(20 )
  );
  
  使用deref 取得关联对象表相关内容
 select workerid,workername,deref(w.workeroffice),phone from  worker w 
   where  workerid  =   ' C001 ' ;
  结果为
 C001   张小明  OFFICETYPE('0001', '财务科')      010-12345 
  
  使用VALUE(别名)查询对象内容
 select value(o) from  office o;

 

5、对象视图
1  创建对象视图(通过OID连接dept)
Java代码   收藏代码
  1. create view deptview of deptype with object oid(deptno) as select *from  dept;  
  2. create view emp_view as select  make_ref(deptview,deptno) deptoid,empno,ename   
  3.   from  emp;  
 create view deptview of deptype with object oid(deptno) as select *from  dept;
 create view emp_view as select  make_ref(deptview,deptno) deptoid,empno,ename 
   from  emp;
分享到:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值