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

Oracle笔记 十二、PL/SQL 面向对象oop编程

2011-05-03 16:11 627 查看
[code]------------------------抽象数据类型-----------
--创建地址类型,一定要加asobject,还可以在类型中加过程或方法
createorreplacetypeaddressasobject(
provincevarchar2(10),--省份属性
cityvarchar2(10)--市属性
)notfinal;--notfinal表示该类型可以有子类型
--定义一个子类型
--underaddress说明这个类型继承至address类型
createorreplacetypedetailAddressunderaddress(
streetvarchar2(20)--街道属性第3个成员
);
--创建员工信息表,最后一列是detailAddress类型
droptableempInfo
createtableempInfo(
eNamevarchar2(20),--员工姓名
eSexchar(2),--性别
eAgeint,--年龄
eAddressdetailAddress--员工地址
);
--增加数据,只能用构造方法
insertintoempInfovalues('aaa','男',28,detailAddress('湖北','襄樊','八一路'));
insertintoempInfovalues('bbb','男',26,detailAddress('湖北','武汉','永清街'));
insertintoempInfovalues('ccc','女',29,detailAddress('湖北','武汉','光谷'));
--查询
select*fromempInfo;
select*fromempInfowhereeSex='男';
select*fromempInfoewheree.eAddress.city='武汉';--如果查询条件包含属性必须用表的别名
--更新有2种方式:
--第一种方式:整体更新
updateempInfoesete.eAddress=detailAddress('湖北','武汉','武昌')wheree.eName='ccc';
--第二种方式:只更新抽象类型的某一列
updateempInfoesete.eAddress.city='武汉'wheree.eName='ccc';
--删除
deletefromempInfoewheree.eAddress.city='武汉';
--为抽象数据类型的属性建立索引
createindexidxemponempInfo(eAddress.city);
--删除
droptableempInfo;
droptypeaddressforce;--强制删除抽象类型
-------------------------------抽象数据类型结束----------------------
------------------对象表,表中的每一行就是一个对象-----------------------
--创建抽象数据类型person,并作为基类型
createorreplacetypepersonasobject(
pNamevarchar2(20),--姓名
pSexchar(2),--性别
pAgeint--年龄
)notfinal;
--创建子类型student,继承person
--后面不要加asobject
createorreplacetypestudentunderperson(
stuIdint
);
--创建对象表stuInfo
createtablestuInfoofstudent;
--为对象表创建主键约束
altertablestuInfoaddconstraintpk_stuInfoprimarykey(stuId);
--插入数据,当普通表插入
insertintostuInfovalues('aaa','男',29,1001);
--插入数据,用构造方法
insertintostuInfovalues(student('bbb','男',26,1002));
insertintostuInfovalues(student('ccc','女',29,1003));
--查询,当普通表用
select*fromstuInfowherestuId=1002;
--更新和删除都用普通的sql语句即可
updatestuInfosetpAge=29wherepName='ccc';
deletefromstuInfowherestuId=1001;
rollback;
--ref(表别名)函数用来返回对象的OID,也就是对象标识符,对象表也有rowid
selectref(s)fromstuInfos;
selectrowid,ref(s)OIDSfromstuInfos;
--创建学生分数表,注意外键
createtablestuScore(
sturefstudent,--stu这一列的值必须出现在stuInfo表中,且stu这一列存的对象的OID而不是对象本身
scoreint--分数
);
--向分数表插入数据,只能用select,不能用普通的values
--错误的做法:insertintostuscorevalues(selectref(s)fromstuInfowherestuId=1001,90)
--正确的做法:
insertintostuscoreselectref(s),90fromstuInfoswherestuId=1001;
insertintostuscoreselectref(s),80fromstuInfos;--插入3行数据
insertintostuscoreselectref(s),70fromstuInfoswherestuId=1003;
--查询
select*fromstuScore;
--deref(列名)函数可以把OID还原为对象,主键列显示有问题
selectderef(s.stu),scorefromstuScoreswheres.stu.stuId=1001;
--修改,以下2个都可以
updatestuScoresetscore=100wherestu=(selectref(s)fromstuInfoswherestuId=1001);
updatestuScoressetscore=99wheres.stu.stuId=1001;
--删除,以下3个都可以
deletefromstuScorewherestu=(selectref(s)fromstuInfoswherestuId=1001);
deletefromstuScoreswheres.stu.stuId=1001;
deletefromstuScorewherestuId=1001;
----------------------------------对象表结束----------------------
----------------------------------对象视图-----------------------
--对象视图的作用:把已经存在的关系表转换为对象表来使用,原表没有变
--首先要创建一个和原表一样的类型
--然后创建视图
createtableaaa
(aint);
createtypeaaaaasobject
(aint);
createorreplaceviewview_stuofaaaawithobjectoid(a)
as
select*fromaaa;
select*fromview_stu;
--增删改查都和对象表一样
-------------------------------对象视图结束-----------------------
--------------------------------抽象类型,包含过程和方法-------------
createorreplacetypeADDRESSasobject(
provincevarchar2(10),--省份
cityvarchar2(10),--市,后面的,不能少
memberfunctionget_proreturnvarchar2,--函数,后面接,而不是;
memberfunctionget_cityreturnvarchar2,
memberprocedureset_pro(provarchar2),--过程
memberprocedureset_city(cyvarchar2)
);
createorreplacetypebodyADDRESS--后面不能加asobject
as--后面不能加begin
memberfunctionget_proreturnvarchar2
is
begin
returnprovince;
endget_pro;
memberfunctionget_cityreturnvarchar2
is
begin
returncity;
end;
memberprocedureset_pro(provarchar2)
is
begin
province:=pro;
end;
memberprocedureset_city(cyvarchar2)
is
begin
city:=cy;
end;
end;
--测试上面的成员函数和过程
declare
addraddress;
begin
addr:=address('湖北','武汉');
dbms_output.put_line(addr.get_city);
end;
--droptablestuInfo;
createtablestuInfo(
stuIdintprimarykey,
addraddress
);
declare
addraddress;
begin
addr:=address('湖北','武汉');
insertintostuInfovalues(1,addr);
addr.set_city('郑州');
addr.set_pro('河南');
insertintostuInfovalues(2,addr);
end;
select*fromstuInfo;
--删除类型
droptypeaddressforce;
--------------------------抽象类型,包含过程和方法结束-------------
----------------------------可变数组------------------------------
--就是一个可以存储多个值的有最大长度的数组,数组的成员可以是任意类型
--建立一个可变数组类型,长度是10,存放的数据类型是number(4)
createorreplacetypearrTypeasvarray(10)ofnumber(4);
createorreplacetypescoreTypeasobject(
subNamevarchar2(10),
scoreint
);
--创建一个长度为10的可变数组,存放数据类型是scorType
createorreplacetypearrScoreTypeasvarray(10)ofscoreType;
--创建学生信息表
--droptablestuInfo;
createtablestuInfo(
stuIdintprimarykey,
scorearrScoreType--可变数组,最多10个成员
);
--插入数据,用可变数组的构造函数
insertintostuInfovalues(1,arrScoreType(
scoreType('sql',50),scoreType('C#',80),scoreType('java',90)));
insertintostuInfovalues(2,arrScoreType(
scoreType('sql',60),scoreType('C#',85),scoreType('java',95),scoreType('html',60)));
insertintostuInfovalues(3,arrScoreType(
scoreType('sql',70),scoreType('java',93)));
--查询
select*fromstuInfo;--查询结果是集合
--如何才能查询出可变数组里的数据呢?思路是:用table函数把集合转化为表,然后再从这个表查询数据
select*fromtable(selects.scorefromstuInfoswheres.stuId=2);
--table函数里面只能是一个可变数组
selects.stuId,t.*fromstuInfos,
table(selectscorefromstuInfowherestuId=s.stuId)t
wheres.stuId=2;
--更新,整个可变数组一起更新,不能只更新数组的某个元素
updatestuInfosetscore=arrScoreType(
scoreType('sql',50),scoreType('C#',80))wherestuId=1;
--删除,按主键删除
-----------------------------可变数组结束---------------------------------
droptypescoreTypeforce;
droptypearrScoreTypeforce;
droptablestuInfo;
-----------------------------嵌套表---------------------------
--创建抽象类型
createorreplacetypescoreTypeasobject(
subNamevarchar2(10),
scoreint
);
--创建嵌套表类型
createorreplacetypenestTableistableofscoreType;
--创建包含嵌套表的学生信息表
createtablestuInfo(
stuIdint,
scorenestTable--其实存的是引用,实际数据存在abc表中
)nestedtablescorestoreasabc;
--nestedtablescorestoreasabc意思是:stuInfo这个表中的score这一列是嵌套表类型,嵌套表实际是存在abc这个表中
--增删和可变数组一样
insertintostuInfovalues(3,nestTable(
scoreType('sql',70),scoreType('java',93)));
--查询,思路:把嵌套表先查出来,然后把嵌套表和stuInfo进行联合查询
select*fromtable(selectss.scorefromstuInfosswherestuId=3);
selects.stuId,t.*fromstuInfos,table(selectss.scorefromstuInfosswherestuId=s.stuId)t
wheres.stuId=3;
--更新
updatetable(selectss.scorefromstuInfosswherestuId=3)t
sett.score=80wheret.subName='sql';
--删除
deletefromtable(selectss.scorefromstuInfosswherestuId=3)t
wheret.subname='sql';
----可变数组和嵌套表的异同----------------
相同点:
1、都是抽象类型
2、都可以作为表中某列的数据类型(record和快表是不能作为列的数据类型的)
不同点:
1、可变数组本身就存放在原表中,而嵌套表存放在另外的表中
2、可变数组有大小限制,而嵌套表没有
3、可变数组更新时必须更新整个可变数组,而嵌套表更新时可以只更新嵌套表中的部分记录
[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: