当前位置:Gxlcms > 数据库问题 > 面向对象的Oracle用法

面向对象的Oracle用法

时间:2021-07-01 10:21:17 帮助过:3人阅读

oralce中面向对象的基本语法

一:抽象数据类型

创建地址类型,一定要加as object,还可以在类型中加过程或方法

create or replace type address as object (

       province varchar2(10), --省份属性

       city varchar2(10) --市属性

not final; --not final表示该类型可以有子类型

 

定义一个子类型,under address说明这个类型继承至address类型

create or replace type detailAddress under address (

       street varchar2(20) --街道属性  3个成员

)

 

创建员工信息表,最后一列是detailAddress类型

drop table empInfo

create table empInfo (

       eName varchar2(20) ,  --员工姓名

       eSex char(2),  --性别

       eAge int, --年龄

       eAddress detailAddress   --员工地址

);

 

--增加数据,只能用构造方法

insert into empInfo values(‘aaa‘, 28, detailAddress(湖北襄樊八一路));

 

--查询

select * from empInfo where eSex = ;

select * from empInfo e where e.eAddress.city = 武汉; --如果查询条件包

 

含属性必须用表的别名

--更新有2种方式:

--第一种方式:整体更新

update empInfo e set e.eAddress = detailAddress(湖北武汉武昌where e.eName = ‘ccc‘;

--第二种方式:只更新抽象类型的某一列

update empInfo e set e.eAddress.city = 武汉 where e.eName = ‘ccc‘;

 

--删除

delete from empInfo e where  e.eAddress.city = 武汉;

 

--为抽象数据类型的属性建立索引

create index idxemp on empInfo(eAddress.city);

--删除

drop table empInfo;

drop type address force; --强制删除抽象类型 

 

二:对象表,表中的每一行就是一个对象

--创建抽象数据类型person,并作为基类型

create or replace type person as object (

       pName varchar2(20),  --姓名

       pSex char(2),   --性别

       pAge int      --年龄

not final;

 

--创建子类型student,继承person,后面不要加as object

create or replace type student under person (

       stuId int

);

 

--创建对象表stuInfo

create table stuInfo of student;

--为对象表创建主键约束

alter table stuInfo add constraint pk_stuInfo primary key(stuId);

--插入数据,当普通表插入

insert into stuInfo values(‘aaa‘, 29, 1001);

--插入数据,用构造方法

insert into stuInfo values(student(‘bbb‘, 26, 1002));

--查询,当普通表用

select * from stuInfo where stuId = 1002;

 

--更新和删除都用普通的sql语句即可

update stuInfo set pAge = 29 where pName = ‘ccc‘;

delete from stuInfo where stuId = 1001;

 

--ref(表别名)函数用来返回对象的OID,也就是对象标识符,对象表也有rowid

select rowid,ref(s) from stuInfo s;

--创建学生分数表,注意外键

create table stuScore (

       stu ref student, --stu这一列的值必须出现在stuInfo表中,且stu这一列存的对象的OID而不是对象本身

       score int  --分数

);

insert into stuscore select ref(s), 90 from stuInfo s where stuId = 1001;

insert into stuscore select ref(s), 80 from stuInfo s; --插入3行数据

insert into stuscore select ref(s), 70 from stuInfo s where stuId = 1003;

 

--查询

select * from stuScore;

--deref(列名)函数可以把OID还原为对象,主键列显示有问题

select deref(s.stu), score from stuScore s where s.stu.stuId = 1001;

 

--修改,以下2个都可以

update stuScore set score=100 where stu = (select ref(s) from stuInfo s where stuId = 1001);

update stuScore s set score = 99 where s.stu.stuId = 1001;

--删除

delete from stuScore where stu = (select ref(s) from stuInfo s where stuId = 1001);

delete from stuScore s where s.stu.stuId = 1001;

 

三:可变数组

--就是一个可以存储多个值的有最大长度的数组,数组的成员可以是任意类型

--建立一个可变数组类型,长度是10,存放的数据类型是number(4)

create or replace type arrType as varray(10) of number(4);

 

create or replace type scoreType as object (

       subName varchar2(10),

       score int

);

--创建一个长度为10的可变数组,存放数据类型是scorType

create or replace type arrScoreType as varray(10) of scoreType;

--创建学生信息表

--drop table stuInfo;

create table stuInfo (

       stuId int primary key,

       score arrScoreType  --可变数组,最多10个成员

);

--插入数据,用可变数组的构造函数

insert into stuInfo values(1, arrScoreType(

       scoreType(‘sql‘, 50), scoreType(‘C#‘, 80), scoreType(‘java‘, 90)));

insert into stuInfo values(2, arrScoreType(

       scoreType(‘sql‘, 60), scoreType(‘C#‘, 85), scoreType(‘java‘, 95), scoreType(‘html‘, 60)));

insert into stuInfo values(3, arrScoreType(

       scoreType(‘sql‘, 70), scoreType(‘java‘, 93)));

--查询

select * from stuInfo;  --查询结果是集合

--如何才能查询出可变数组里的数据呢?思路是:用table函数把集合转化为表,然后再从这个表查询数据

select * from table(

人气教程排行