面向对象的Oracle

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

1、
Oracle面向对象的最基本元素是它的对象类型——Type
下面开始写自定义对象类型(
as object 必须关键字)
1  create   or   replace  type ADDRESS  as  object
2  (
3       PROVINCE  varchar ( 10 ),
4       CITY  varchar ( 20 ),
5       STREET  varchar ( 30 )
6  );

创建表并使用以上对象类型ADDRESS
1  create   table  STUDENTOBJ 
2  (
3      STUNAME  varchar ( 20 ),
4      STUADD  ADDRESS
5  );
6 
7  向表中插入数据:
8  insert   into  STUDENTOBJ  values ( ' improviser ' ,ADDRESS( ' 广东省 ' , ' 广州市 ' ' 江海大道 ' );

通过别名对表进行查询
1  select  S.STUNAME S.ADDRESS.PROVINCE S.ADDRESS.CITY
2 S.ADDRESS.STREET 
from  STUDENTOBJ S;

从上面的测试代码,可以很容易看到其与面向对象语言(比如Java)的差异,不必使用new创建实例,也没有了默认无参数构造器,默认使用定义的属性作为构造器参数,足以描述各种实体。另外,Type的属性没有private,protected,public的说法,所有的属性调用者都可以访问,即都是public。

2、Oracle中面向对象特征——继承(父类型必须声明为NOT FINAL,子类型使用关键字UNDER)

 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  );

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

3、可变数组
可变数组,是一种集合。一个可变数组是对象的一个集合,其中每个对象都具有相同的数据类型。可变数组的大小由创建时决定。在表中建立可变数组后,可变数组在主表中作为一个列对待。
 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( ' 广东省 ' , ' 广州市 ' , ' 江海大道 ' ),
                                           ADDRESS(
' 广东省 ' , ' 潮州市 ' , ' 潮枫路 ' )));
20 
21  查询(使用table函数将数据表格形式输出)
22  select   * from   table ( select  s.STUADDS  from  STUDENT  where  STUNAME = ' improviser ' );

4、嵌套表
嵌套表是表中之表,一个嵌套表是某些行的集合,它在主表中表示为其中的一列。对主表中的每一条记录,嵌套表可以包含多个行。

 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  =   ' 潮州 市' ;
13

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

4、对象表

 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
  
where  workerid  =   ' C001 ' ;
22  结果为
23  C001   张小明  OFFICETYPE( ' 0001 ' ' 财务科 ' )      010 - 12345
24 
25  使用VALUE(别名)查询对象内容
26  select  value(o)  from  office o;
27 

5、对象视图
1  创建对象视图(通过OID连接dept)
2  create   view  deptview  of  deptype  with  object oid(deptno)  as   select   * from  dept;
3  create   view  emp_view  as   select  make_ref(deptview,deptno) deptoid,empno,ename
4    from  emp;

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值