培训机构的Oracle学习笔记5.docx
- 文档编号:10719355
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:16
- 大小:19.71KB
培训机构的Oracle学习笔记5.docx
《培训机构的Oracle学习笔记5.docx》由会员分享,可在线阅读,更多相关《培训机构的Oracle学习笔记5.docx(16页珍藏版)》请在冰点文库上搜索。
培训机构的Oracle学习笔记5
数据库查询的结果本质上是一个游标所以在调用一个查询功能,得到的其实是一个游标,然后从游标中将结果loop出来.
将游标看成数据库对其他应用程序提供数据的接口。
游标返回所有学生信息-和欢迎消息-使用sql/plus调用存储过程显示所有游标数据-inout模式的使用
注意:
函数的返回值类型问题,参数的模式in、out、inout
返回所有学生信息
functionquerystureturnrec
is
rrcrec;
begin
openrrcforselect*fromstu;
returnrrc;
end;
调用
declare
typereisrefcursor;
rrere;
rsstu%rowtype;
begin
rre:
=p_stumanger.querystu;
loop
fetchrreintors;
exitwhenrre%notfound;dbms_output.put_line(rs.sid||rs.stno||rs.sname||rs.sage||rs.sqq);
endloop;
end;
--根据条件查询,返回所有学生信息和欢迎消息的函数procedurequerystu(s_sexstu.ssex%type,msgoutvarchar2,reoutrec)is
begin
openreforselect*fromstu;msg:
='欢迎您查询本系统';end;
调用declares_sexstu.ssex%type;msgvarchar2(100);typerisrefcursor;rrr;
sstu%rowtype;
beginp_stumanger.querystu(s_sex=>s_sex,msg=>msg,re=>rr);loop
fetchrrintos;
exitwhenrr%notfound;dbms_output.put_line(s.sid);
endloop;
end;
user_objects数据字典,查询所有的对象
select*fromuser_objects;
select*fromuser_objectswhereOBJECT_TYPE='FUNCTION';
使用sql/plus调用存储过程显示所有游标数据,注意,和pl/sql程序块区分开
定义包
定义过程,过程可定义游标类型的参数out模式
sql>varrrefcursor;
sql>setautoprinton;
sql>exec包名.过程名(:
r);
注意:
inout模式的使用,此例ena参数既可以接收值,又可以带出去一个同类型的值
createorreplacepackagebodypemp
is
procedurequery(enainoutemp.ename%type)
is
reemp%rowtype;
begin
select*intorefromempwhereename=ena;
ena:
=你好';
end;
end;
调用
declare
enemp.ename%type;
en:
='SMITH';
pemp.query(ena=>en);1、en将值传给ena2、过程执行完毕,由ena再将值带出来传给en
dbms_output.put_line(en);
end;
学生管理系统-包头-包体-6个功能函数或过程
模块一:
学生基本信息管理模块包,此模块包包含6个功能函数或过程,分别如下说明
包头
createorreplacepackagep_stumanger
is
--typet_stuistableofstu%rowtypeindexbybinary_integer;
typerecisrefcursor;
--新生注册
functionaddstu(s_namestu.sname%type,s_sexstu.ssex%type,s_agestu.sage%type,s_add
stu.sadd%type,s_qqstu.sqq%type,s_emailstu.semail%type)returnint;
--学生删除
proceduredelstu(s_idinoutstu.sid%type);
--更新学生
procedureupdatestu(rstustu%rowtype,routint);
--复制表数据到另一个表中
functioncopystu(trec,msgoutvarchar2)returnint;
--查询所有学生,得到的结果以游标形式返回出去
procedurequerystu(s_sexstu.ssex%type,msgoutvarchar2,reoutrec);
procedurequery(rcinoutrec);
end;
学生基本信息管理模块包体实现
createorreplacepackagebodyp_stumanger
is
--新生注册
functionaddstu(s_namestu.sname%type,s_sexstu.ssex%type,s_agestu.sage%type,s_add
stu.sadd%type,s_qqstu.sqq%type,s_emailstu.semail%type)returnint
is
insertintostu(sname,ssex,sage,sqq,semail,sadd)values(s_name,s_sex,s_age,s_add,s_qq,s_email);
returnsql%rowcount;
end;
--学生删除
proceduredelstu(s_idinoutstu.sid%type)
is
begin
deletestuwheresid=s_id;
s_id:
=sql%rowcount;
end;
--更新学生,接受一个实体,这个实体为一条记录procedureupdatestu(rstustu%rowtype,routint)is
begin
updatestusetsname=rstu.sname,ssex=rstu.ssex,sage=rstu.sage,sqq=rstu.sqq,semail=rstu.semail,sadd=rstu.sadd,stno=rstu.stnowheresid=rstu.sid;
r:
=sql%rowcount;
end;
--测试使用包中的函数复制表,此函数接受一个pl/sql表,该表封装了了stu表中的所
有的数据
functioncopystu(trec,msgoutvarchar2)returnint
is
srstu%rowtype;
errmsgvarchar2(100):
='';
cint:
=0;
eint:
=0;
begin
loop
fetchtintosr;
exitwhent%notfound;
insertintostu1values(sr.sid,sr.sname,sr.ssex,sr.sage,sr.sqq,sr.semail,sr.sadd,sr.stno);
c:
=c+sql%rowcount;
ifsql%rowcount=0then
e:
=e+1;
errmsg:
=errmsg+('学生为编号'||sr.sid||'学号:
'||sr.stno||'姓名:
'||sr.sname||'复制失败了,请查清后重新复制');
endif;
endloop;
errmsg:
='总共有’||c||个学生复制成功’||e||失败';
msg:
=errmsg;
return1;
end;
--查询所有学生,由游标参数带出去
procedurequerystu(s_sexstu.ssex%type,msgoutvarchar2,reoutrec)
is
begin
openreforselect*fromstu;
msg:
='欢迎您查询本系统’;
end;
procedurequery(rcinoutrec)
is
begin
openrcforselect*fromstu;
end;
end;
对象类型-创建类型-使用-向表操作数据-数据字典的使用-创建对象表
作用:
1、可使用自定义的对象类型作为表字段的类型,简化表的数据结构
2、方便操作
3、可以直接操作对象中的方法
使用:
1、创建类型
createorreplacetype类型名asobject(成员变量列表,字符类型的需给定长度);
如createorreplacetypecomputerasobject(cidvarchar2(10),cpricenumber,cbrandvarchar2(10));
2、使用
创建表,使用其作为字段类型
createtable表名(表基本类型字段列表,对象类型字段定义);
如createtablestu(sidvarchar2(10),snamevarchar2(10),comcomputer);
向表插入数据
insertintostuvalues('1','张飞',computer('1',2233.23,'IBM'));
修改
更新根据表中的对象字段作为条件更新,条件也需要逐层调用
updatestu_ssetsname=sname『_2'wheres.c.cname*年级1班';
对象字段的方法1
修改对象中成员变量的数据,也需要逐层调用,给对象中的成员变量重新赋值
updatestu_ssetame=「年级2班'wheresid='1:
对象字段的方法2直接从新构造对象
updatestu_ssets.c=cla(3,'—年级3班',21)wheres.sid='1';
查询
根据表中的对象字段作为条件查询,条件也需要逐层调用
select*fromstu_swheres.c.cname='—年级1班';
实例:
更新"一年级3班"的班级编号方法1
updatestu_ssets.c.cid=3whereame='—年级3班';
方法2
updatestu_ssets.c=cla('4','一年级3班',12)whereame='一年级3班';
数据字典的使用
查看所有的对象类型
select*fromuser_type_attrs;
查看表的信息
select*fromuser_tab_columnswheretable_name='STU_';
对象成员方法声明
CREATEORREPLACETYPECLA3ASOBJECT(
CIDVARCHAR2(10),CNAMEVARCHAR2(10),
memberprocedurestudy,
memberfunctionstuareturnvarchar2
);
如果有方法,必须实现,类似于包和包体中的函数和过程
CREATEORREPLACETYPEbodyCLA3AS
memberprocedurestudy
is
begin
dbms_output.put_line(cid);
end;
memberfunctionstuareturnvarchar2is
begin
returncname;
end;
end;
对象中方法的调用
declare
ccla3;
ssst4%rowtype;
cursorcuisselect*fromst4;
begin
opencu;
loop
fetchcuintoss;exitwhencu%notfound;dbms_output.put_line(ss.c2.stua);
endloop;
end;
根据年级人数和人均分数计算总分
CREATEORREPLACETYPECLA4ASOBJECT(
CIDVARCHAR2(10),CNAMEVARCHAR2(10),csnumber,memberprocedurestudy,
--计算总分
memberfunctionstuareturnnumber
);
CREATEORREPLACETYPEbodyCLA4AS
memberprocedurestudy
is
begin
dbms_output.put_line(cid);
end;
memberfunctionstuareturnnumber
is
scorenumber:
=0;
begin
ifcname='一年级'then
score:
=10;
endif;
ifcname='二年级'then
score:
=20;
endif;
ifcname='三年级'then
score:
=30;
endif;
returncs*score;
end;
end;
根据静态方法得到共享的数据作为业务逻辑中的中间值srta.t(ame),存储在sco表中
的年级的人均分数头createorreplacetypesrtaasobject(
snamevarchar2(10),
staticfunctiont(cnamevarchar2)returnnumber);
体
createorreplacetypebodysrta
as
staticfunctiont(cnamevarchar2)returnnumberis
rsco%rowtype;
begin
select*intorfromscowheresname=cname;returncs*r.sc;
end;
end;
测试
declare
cursorrsisselect*fromst5;
rrst5%rowtype;
begin
openrs;
loop
fetchrsintorr;
exitwhenrs%notfound;dbms_output.put_line(rr.c2.cs*srta.t(ame));endloop;
end;
创建对象表表中的行如果是行对象createtablet9ofcla4;如果是行对象,则可以直接当作关系型的表处理value()函数的使用:
取得行对象整行记录的值
declare
dcla4;--对象类型的变量
begin
selectvalue(t)intodfromt9t;dbms_output.put_line(d.CID||d.CNAME);end;
-增加数据-更新、
嵌套表和可变数组-可变数组的定义-使用对象类型作为可变数组的基类型删除可变数组中的元素-嵌套表
注意:
1、数组的最大值2、基本类型如果是字符串,长度定义
创建表,用可变数组作为其列类型
createorreplacetypearr_asvarray(10)ofvarchar2(10)
增加数据,可使用构造函数构造除可变数组对象
insertintoclasses2values('1','—年级',arr_('小张','小明','小红',李俊'));
查询数据
使用table()函数将数组转换成关系型的表
select*fromtable(selectstufromclasses2);
删除,新增可变数组中的元素,采用数组重新构造的方法,更新数组字段
updateclasses2setstu=arr_(小张','小明','李俊')wherecid='1:
总结:
可变数组中的元素增、删、改、查都是采用可变数组重新构造的方式来完成
使用表的别名查询
将转换之后的关系型的表亦可以定义别名
selectc.*fromtable(selectstufromclasses2wherecid='1')c;
使用对象类型作为可变数组的基类型
1、创建基类型
createorreplacetypestu8asobject(sidvarchar2(10),snamevarchar2(10),ssexvarchar2
(2),sagenumber,sqqvarchar2(15));
2、使用对象类型作为可变数组的基类型
createorreplacetypestus0asvarray(100)ofstu8;
3、使用可变数组作为关系表中字段的类型
createtableclass1(cidvarchar2(10)primarykey,cnamevarchar2(10),sstus0);
增加数据
1、可变数组字段采用重构方式
2、可变数组内部的元素采用对象重构方式产生对象值
insertintoclasslvalues('1','—年级',stus0(stu8('1','小红','女',12,'234234'),stu8('2','小明','男',11,'234234'),stu8(3,'李俊','男',22,'234234')));
更新、删除可变数组中的元素
update表中的数组字段,重构数组
updateclass1sets=stus0(stu8('1','小红','男',12,'234234'),stu8('2','小明','男',11,'234234'),stu8('3','李俊','男',22,'234234'))wherecid='1';
查询所有的数组中的数据。
因为数组类型的字段转换成关系表之后,此关系表中只有一个字段,并且
该字段内部的数据是对象类型的,可成为此关系型的表为对象表。
根据对象表中行对象的规定,如果对象表中的每一行是行对象,则此对象表可直接当作关系型的表操作
select*fromtable(selectsfromclass1);
查询数组中某一个或几个字段,所有学生的姓名
selects.snamefromtable(selectsfromclass1)s;
selects.sname,s.ssexfromtable(selectsfromclass1)s;
根据数组中对象的字段作为条件查询
selectss.*fromtable(selectsfromclass1)sswheress.sname='小红';
更新、删除、新增对象中元素的值,采用全部重构注意修改可变数组中元素的值,如果采用数组中元素其他值作为修改条件,无意义,并且oracle不允许使用
此条件但是,可以使用该数组所在的关系表中的其他字段作为条件
updateClassisets=stus0(stu8('1','小红','女',12,'234234'),stu8('2','小明','男',11,'234234'),stu8('3','李俊',男',22,'234234'))whereame='一年级';
嵌套表
1、创建对象以作为嵌套表的基类型
createorreplacetypen_stuasobject(sidvarchar2(10),snamevarchar2(10),ssexvarchar2
(2));
2、使用对象类型作为嵌套表基类型
createorreplacetypenesttableastableofn_stu;
3、使用嵌套表作为主表字段类型
4、注意定义是哪个字段作为嵌套表,以及将该嵌套表保存在哪个表空间,表空间是在定义此嵌套表的时候
实时的分配的,该表空间的名称应该指定
createtablecalss2(cidvarchar2(10)primarykey,cnamevarchar2(10),nstnesttable)nestedtablenststoreasaa;
增加记录,一定要注意,第一次使用时必须使用构造函数对嵌套表初始化
insertintocalss2values('1','一年级',nesttable(n_stu('1','小红','女'),n_stu('2','小明','男')));
查询(同可变数组)
select*fromtable(selectnstfromcalss2);
根据嵌套表字段作为条件查询
selects.sid,s.sname,s.ssexfromtable(selectnstfromcalss2)swheres.sname=小、红';
增加
插入数据,首先得到嵌套表的关系表,因为得到的关系表中只有一个字段,此字段是对象型的,每行成为行对象,
所以可直接当作普通的关系表处理
insertintotable(selectnstfromcalss2)values('3','张飞','男');
删除,根据嵌套表中的对象的字段作为条件删除
deletetable(selectnstfromcalss2)swheres.sname='张飞';修改将嵌套表中的对象的字段修改,可根据嵌套表中对象的其他字段作为条件updatetable(selectnstfromcalss2)sset$36乂=女'wheres.sname=7小明';
如果在给主表中插入记录时,没有初始化嵌套表字段,那么该字段为null
以后再使用此嵌套表之前首先更新该字段,为其初始化
updatecalss2setnst=nesttable(n_stu('1',小红','女'),n_stu('2','小张',男'))wherecid=2;
嵌套表和可变数组的区别
1、可变数组不能执行DML操作嵌套表可以,嵌套表如果在初始化的时候为null,第一次必须使用构造函数向嵌套表插入数据
2、可变数组指定长度嵌套表不需指定
3、可变数存放在主表中嵌套表存储在自定义的表空间中,是一个独立的表,只需将
嵌套表对象的地址保存在主表中即可
相同点
1、构造的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 培训 机构 Oracle 学习 笔记
![提示](https://static.bingdoc.com/images/bang_tan.gif)