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

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

2012-09-06 15:19 393 查看
------------------------抽象数据类型-----------

--创建地址类型,一定要加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、可变数组更新时必须更新整个可变数组,而嵌套表更新时可以只更新嵌套表中的部分记录
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: