您的位置:首页 > 数据库 > Oracle

Oracle对象关系数据库

2009-12-27 23:24 288 查看
一.对象关系数据模型

1.Oracle允许数据属性有复杂的属性(如:结构化类型,表中表,大对象类型,汇集类型,结构化类型,允许继承,支持函数和过程。

a. 汇集类型:create type arrant as Array[4] int

b. 大对象类型:Blob ,二进制大对象;Clob,字符型大对象。返回的是大对象的指针。

c. 引用类型:引用有范围的,在范围之内。

d. 结构类型:也可用于定义表,类似于c,c++中的结构类型

e. 继承:类似于类的继承:

父类:

create type person (name varchar(20), address varchar(20))

子类:

create type student under person ( salary integer,department varchar(20))

f. 函数与过程:

二.对象关系的sql

1.列对象:某列是用户定义的对象

2.行对象:整行是一个用户定义的对象

3.关系表:多个属性,某些列可能是对象,但不是整行都是对象

4.对象表:整行是一个对象类型,每一行是一个行对象。

1.定义关系表:

a.定义对象类型

Create type name_t as Object ( Lname varchar(20),Fname varchar(20));

Create table scientists of name_t;

Insert into scientists values(‘Einstein’,’Albert’);

Update scientists s set s=name_t(‘Einstein’,’Alb’)

Where value(s)=name_t(‘Einstein’,’Albert’)

b.定义关系表

create table teacher ( tname name_t ,roomNo varchar(50))

insert into teacher (name_t(“Jenny”,”Chen”),’001’)

select value(t) from teacher t where t.tname.Lname=”Jenny”

select value(t) from teacher t where t.tname=name_t(“jenny”,”chen”)

c.定义对象表

Create table NameList of name_t

两种select的方法:

1.取各属性,以各属性的方式取数据(表必须加别名)

Select N.Lname, N.Fname from NameList N where N.Fname=’chen’

2.以对象的形式取数据

select value(N) from NameList N where N.Fname=’chen’

2.引用数据类型:

Ref 指针指向行对象(有点象外键);

scoped refs 范围内的引用(有条件的外键),比ref占更少的存储空间,访问数据更有效。

Ref依赖:若相互依赖,则强制删除。Drop type name_t force

Ref装载数据:先加数据,再更新ref

Ref挂起:由于ref指向的对象被删除导致权限的改变,称ref挂起。

一.创建对象

Create type police_officer_t as object

( pol_person name_t,

Badge_number integer,

Partner ref police_officer_t);

二.创建对象表

Create table police_officers of police_officer_t

(

Primary key (barge_number), //定义主键

Scope for (partner) is police_officers //定义ref的范围

)

三.Select pol_person.lname from police_officers p

where p.partner.pol_person.rightname=’chen’

四.Select value(p),deref(p.partner) from police_officers p;

Insert into police_officers

Select value(p) ,100,ref(100) from people p, police_officers po

Where p.ssno=0332245 and po.badge_number=’990’

Update police_officers set p.partner=(select ref(po) from police_officers po where po.badg_number=100)

Where badg_number=990;

2.汇集类型:支持多子属性,表中嵌套表,数组。

1.创内嵌表:内嵌表与主表是分开放的,用指针指向内嵌表。

2.数组:有序的;与主表一起存放,有最大下标限制。

内嵌数组:

Eg:1.create type ext_t as array(4) of int;

2. create table phonebook( person name_t; extensions ext_t)

Select pb.person.lname,pb.extensions from phonebook pb

Where pb.person.rname=’chen’

Select pb.person.lname ,(select count(*) from table(pb.extensions))

from phonebook pb;

select pb.person from phonebook pb

where 104 in (select * from table(pb.extensions));

update phonebook pb set extensions=extension_t(345,999)

where pb.person.lname=’jenny’;

内嵌表:

1.建子表

Create type dependents_t as table of name_t;

2.建内嵌表

Create table employee (

Eid int,

Eperson name_t;

Dependents dependents_t; 表中嵌已定义的子表 dependents_t

Primary key (eid)

) nested table depentents store as dependent_tab

3.使用内嵌表

Select Dependents from employee where Eid=100;

Select eid from employee e

where 6<(select count(*) from table (e. Dependents )) //表强制类型转换

select eid from employee e where name_t(‘Lukas’,’Elbert’) in

(select d.lname from tables(e. Dependents) d);

Select d.ssno from table(select e. Dependents from employee e where e.eid=101);

Selct count(*) from table (select e. Dependents from employee e where e.eid=101);

insert into table(select e.dependents from employee e where e.eperson.lname=’jenny’)

values(3445,name_t(‘jenny’,’chen’),0);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: