Oracle中的面向对象OOP

Oracle中的面向对象OOP

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

1、
Oracle面向对象的最基本元素是它的对象类型——Type
下面开始写自定义对象类型(
as object 必须关键字)
1createorreplacetypeADDRESSas object
2
(
3PROVINCEvarchar(10
),
4CITYvarchar(20
),
5STREETvarchar(30
)
6);

创建表并使用以上对象类型ADDRESS
1createtable STUDENTOBJ
2
(
3STUNAMEvarchar(20
),
4
STUADDADDRESS
5
);
6

7 向表中插入数据:
8insertintoSTUDENTOBJvalues('improviser',ADDRESS('广东省','广州市''江海大道');

通过别名对表进行查询
1select S.STUNAMES.ADDRESS.PROVINCES.ADDRESS.CITY
2 S.ADDRESS.STREET
from STUDENTOBJS;

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

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

1 创建父类型
2createorreplacetypePERSONas
object
3
(
4PERNAMEvarchar(10
),
5PERSEXvarchar(2
)
6)not
final;
7

8 子类型继承父类型
9createorreplace
typeSTUDENTunderPERSON
10
(
11STUNOvarchar(8
),
12STUSCOREvarchar(10
)
13
);

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

3、可变数组
可变数组,是一种集合。一个可变数组是对象的一个集合,其中每个对象都具有相同的数据类型。可变数组的大小由创建时决定。在表中建立可变数组后,可变数组在主表中作为一个列对待。
1 创建对象类型
2createorreplacetypeADDRESSas
object
3
(
4PROVINCEvarchar(10
),
5CITYvarchar(20
),
6
);
7

8 创建ADDRESS可变数组
9createorreplacetypeADDRESS_LISTasvarray(3)of
ADDRESS;
10

11 创建表并使用可变数组ADDRESS_LIST
12createtable
STUDENT
13
(
14STUNAMEvarchar(20
),
15
STUADDSADDRESS_LIST
16
);
17

18 向表中插入数据
19insertintoSTUDENTvalues('improviser',ADDRESS_LIST(ADDRESS('广东省','广州市','江海大道'
),
ADDRESS(
' 广东省 ' , ' 潮州市 ' , ' 潮枫路 '
)));
20

21 查询(使用table函数将数据表格形式输出)
22select*fromtable(selects.STUADDSfromSTUDENTwhereSTUNAME='improviser');

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

1 定义嵌套表方法:
2createorreplacetypeADDRESS_TABLEastableof
ADDRESS;
3

4 基本对象类型、创建表、查询和插入数据都跟上面可变数组一样
5

6嵌套表更新table转化为表再利用表别名操作列进行更新
7updatetable(selectS.STUADDSfromSTUDENTSwhere

8 S.STUNAME = ' improviser ' )AD set AD.PROVINCE = ' 北京 ' where city = ' 广州 ' ;
9

10 删除嵌套表记录
11 delete from table ( select S.STUADDS from
STUDENTS
12
where S.STUNAME = ' improviser ' )AD where AD.city = ' 潮州 市'
;
13

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

4、对象表

1 首先创建对象类型
2createorreplacetypeOFFICETYPEas
object
3
(
4idvarchar(10
),
5typenamevarchar(20
)
6
);
7

8 将对象类型转化为对象表
9createtableofficeof
officetype;
10

11 创建对象关系表(使用ref,指示OID进行对象表关联)
12createtable
worker
13
(
14workeridvarchar(10)primarykey
,
15workernamevarchar(20
),
16workerofficerefofficetpeyscopeis
office,
17phonevarchar(20
)
18
);
19

20 使用deref取得关联对象表相关内容
21selectworkerid,workername,deref(w.workeroffice),phonefrom
workerw
where workerid = ' C001 '
;
22
结果为
23C001张小明OFFICETYPE('0001','财务科') 010-12345

24
25 使用VALUE(别名)查询对象内容
26selectvalue(o)from
officeo;
27


5、对象视图

1 创建对象视图(通过OID连接dept)
2createviewdeptviewofdeptypewithobjectoid(deptno)asselect*from
dept;
3createviewemp_viewasselect
make_ref(deptview,deptno)deptoid,empno,ename
4 from
emp;


好了,有关Oracle中面向对象的内容就简要叙述这么多了,虽然现在很少使用到,但在以后有用到之处有一定的参考作用。

猜你喜欢

转载自duoluohua.iteye.com/blog/1924257