面向对象数据库中存储的是对象对象有自己的行为和属性
行为体现为类型的函数或者过程属性体现为字段
对象表确实有优势吗?
基于抽象类型创建关系表和其他表的创建一样
基于抽象类型创建对象表create table 对象表名 of 抽象数据类型
抽象类型可以复用也就是说一个抽象类型中可以包含另一个抽象类型做为一个字段
构造函数是默认创造的参数包括类型的字段
如果要插入数据到对象表有两种方式
一种就是insert into tablename values(字段字段);
另一种就是我们如果想直接用构造函数构造一个大字段直接插入
这时候不需要values但必须用slect:
insert into tablename select 构造函数(字段字段) from xxx;
创建带方法的类型
首先说方法的定义如果有返回值用member function
没有返回值member procedure
****以后再说
可变数组
声明一下Oralce的oop中使用下列的对象类型
·抽象数据类型
·可变数组
·嵌套表
·对象表
·对象视图
可变数组会根据存储数据的大小来真正存储数据而不是占用固定的空间这类似
Java中的ArraryList类
关系型理论中不允许一个表中的一个记录中存储其他表记录
而Oracle中是支持的这不是违反了数据的原子性原则吗?
但是这样有好处
在用户查询的时候比两个表进行关联查询效率高
所以说可变数组也可以做为一条记录的一个字段被存储在一个表中
当然这是违反关系数据理论的
创建可变数组的例子
create or replace type mingxitype as object
(
goodsid varchar()
incount int
providerid varchar()
);
/
create or replace type arrmingxitype as varray() of mingxitype;
/
create table instock
(
orderid int primary key
indate date
mingxi arrmingxitype
)
/
insert into instock
values(to_date(yyyymmdd)
arrmingxitype(mingxitype(so)
mingxitype(j)
mingxitype(i)
)
)
/
//table函数可以把可变数组转换为关系表的形式显示出来
select * from table(select smingxi from instock s where orderid=)
GOODSID INCOUNT PROVIDERID
so
j
i
可变数组的元素不能单独改必须全部改
所以可变数组适合的场合是
用户不会修改的数据历史性的数据就适合用可变数组
删除数据是通用的
//可变数组的基类型是用户定义的所以这个基类型也可以是一般数据类型比如int;
create or replace type arrayint as varray() of int;