已阅读5页,还剩43页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
,Oracle10g数据库应用教程,授课教师:职务:,第10章游标、存储过程和触发器,课程描述介绍Oracle数据库程序设计中经常会用到的3个概念,即游标、存储过程和触发器。,本章知识点,游标存储过程管理触发器管理,游标,游标的基本概念游标控制语句游标属性游标FOR循环,游标的基本概念,游标示意图,游标的基本概念,使用显式游标(1)说明游标。(2)打开游标。(3)读取数据。(4)关闭游标。,游标的基本概念,隐式游标【例】使用SELECT语句声明隐式游标,从HR.Departments表中读取Department_name字段的值到变量DepName:SETServerOutputON;DECLAREDepNameHR.Departments.Department_Name%Type;BEGINSELECTDepartment_nameINTODepNameFROMHR.DepartmentsWHEREDepartment_ID=10;dbms_output.put_line(DepName);END;,游标控制语句,(1)声明游标语句CURSOR:DECLARECURSOR()IS;【例】声明一个游标MyCur,读取指定类型的用户信息:DECLARECURSORMyCur(varTypeNUMBER)ISSELECTUserId,UserNameFROMUsersWHEREUserType=varType;,游标控制语句,(2)打开游标语句OPEN:OPEN();【例】打开游标MyCur,读取类型为1的用户信息:OPENMyCur(1);,游标控制语句,(3)游标取值语句FETCH。游标取值语句FETCH的基本语法结构如下:FETCHINTO;【例】在打开的游标MyCur的当前位置读取数据:FETCHMyCurINTOvarI,dvarName;(4)关闭游标语句CLOSE:CLOSE;【例】关闭游标MyCur:CLOSEMyCur;,游标控制语句,【例】下面介绍一个完整的游标应用实例:/*打开显示模式*/SETServerOutputON;DECLARE-开始声明部分varIdNUMBER;-声明变量,用来保存游标中的用户编号varNameVARCHAR2(50);-声明变量,用来保存游标中的用户名-定义游标,varType为参数,指定用户类型编号CURSORMyCur(varTypeNUMBER)ISSELECTUserId,UserNameFROMUsersWHEREUserType=varType;BEGIN-开始程序体OPENMyCur(1);-打开游标,参数为1,表示读取用户类型编号为1的记录FETCHMyCurINTOvarId,varName;-读取当前游标位置的数据CLOSEMyCur;-关闭游标dbms_output.put_line(用户编号:|varId|,用户名:|varName);-显示读取的数据END;-结束程序体,游标属性,(1)%ISOPEN属性【例】下面的代码演示当使用未打开的游标时,将会出现错误:/*打开显示模式*/SETServerOutputON;DECLARE-开始声明部分varNameVARCHAR2(50);-声明变量,用来保存游标中的用户名varIdNUMBER;-声明变量,用来保存游标中的用户编号-定义游标,varType为参数,指定用户类型编号CURSORMyCur(varTypeNUMBER)ISSELECTUserId,UserNameFROMUsersWHEREUserType=varType;BEGIN-开始程序体FETCHMyCurINTOvarId,varName;-读取当前游标位置的数据CLOSEMyCur;-关闭游标dbms_output.put_line(用户编号:|varId|,用户名:|varName);-显示读取的数据END;-结束程序体,游标属性,【例】修改上面的程序,在使用游标之前,调用%ISOPEN属性判断游标是否打开。/*打开显示模式*/SETServerOutputON;DECLARE-开始声明部分varNameVARCHAR2(50);-声明变量,用来保存游标中的用户名varIdNUMBER;-声明变量,用来保存游标中的用户编号-定义游标,varType为参数,指定用户类型编号CURSORMyCur(varTypeNUMBER)ISSELECTUserId,UserNameFROMUsersWHEREUserType=varType;BEGIN-开始程序体IFMyCur%ISOPEN=FALSEThenOPENMyCur(2);ENDIF;FETCHMyCurINTOvarId,varName;-读取当前游标位置的数据CLOSEMyCur;-关闭游标dbms_output.put_line(用户编号:|varId|,用户名:|varName);-显示读取的数据END;-结束程序体,游标属性,(2)%FOUND属性和%NOTFOUND属性【例】%FOUND属性可以循环执行游标读取数据:/*打开显示模式*/SETServerOutputON;DECLARE-开始声明部分varNameVARCHAR2(50);-声明变量,用来保存游标中的用户名varIdNUMBER;-声明变量,用来保存游标中的用户编号-定义游标,varType为参数,指定用户类型编号CURSORMyCur(varTypeNUMBER)ISSELECTUserId,UserNameFROMUsersWHEREUserType=varType;BEGIN-开始程序体IFMyCur%ISOPEN=FALSEThenOPENMyCur(1);ENDIF;FETCHMyCurINTOvarId,varName;-读取当前游标位置的数据WHILEMyCur%FOUND-如果当前游标有效,则执行循环LOOPdbms_output.put_line(用户编号:|varId|,用户名:|varName);-显示读取的数据FETCHMyCurINTOvarId,varName;-读取当前游标位置的数据ENDLOOP;CLOSEMyCur;-关闭游标END;-结束程序体,游标属性,(3)%ROWCOUNT属性【例】只读取前2行记录:/*打开显示模式*/SETServerOutputON;DECLARE-开始声明部分varNameVARCHAR2(50);-声明变量,用来保存游标中的用户名varIdNUMBER;-声明变量,用来保存游标中的用户编号-定义游标,varType为参数,指定用户类型编号CURSORMyCur(varTypeNUMBER)ISSELECTUserId,UserNameFROMUsersWHEREUserType=varType;,游标属性,BEGIN-开始程序体IFMyCur%ISOPEN=FALSEThenOPENMyCur(1);ENDIF;FETCHMyCurINTOvarId,varName;-读取当前游标位置的数据WHILEMyCur%FOUND-如果当前游标有效,则执行循环LOOPdbms_output.put_line(用户编号:|varId|,用户名:|varName);-显示读取的数据IFMyCur%ROWCOUNT=2THENEXIT;ENDIF;FETCHMyCurINTOvarId,varName;-读取当前游标位置的数据ENDLOOP;CLOSEMyCur;-关闭游标END;-结束程序体,游标FOR循环,【例】声明记录类型User_Record_Type和定义记录变量var_UserRecord:TYPEUser_Record_TypeISRECORD(UserIdUsers.UserId%Type,UserNameUsers.UserName%Type);var_UserRecordUser_Record_Type;,游标FOR循环,【例】PL/SQL记录可以与游标结合使用:/*打开显示模式*/SETServerOutputON;DECLARE-开始声明部分/*声明记录类型*/TYPEUser_Record_TypeISRECORD(UserIdUsers.UserId%Type,UserNameUsers.UserName%Type);/*定义记录变量*/var_UserRecordUser_Record_Type;-定义游标,varType为参数,指定用户类型编号CURSORMyCur(varTypeNUMBER)ISSELECTUserId,UserNameFROMUsersWHEREUserType=varType;,游标FOR循环,BEGIN-开始程序体IFMyCur%ISOPEN=FALSEThenOPENMyCur(1);ENDIF;LOOPFETCHMyCurINTOvar_UserRecord;-读取当前游标位置的数据到记录变量var_UserRecordEXITWHENMyCur%NOTFOUND;-当游标指向结果集结尾时退出循环/*显示保存在记录变量var_UserRecord中的数据*/dbms_output.put_line(用户编号:|var_UserRecord.UserId|,用户名:|var_UserRecord.UserName);ENDLOOP;CLOSEMyCur;-关闭游标END;-结束程序体,游标FOR循环,【例】典型游标FOR循环的例子:/*打开显示模式*/SETServerOutputON;DECLARECURSORMyCur(varTypeNUMBER)ISSELECTUserId,UserNameFROMUsersWHEREUserType=varType;BEGIN-开始程序体FORvar_UserRecordINMyCur(1)LOOP/*显示保存在记录变量var_UserRecord中的数据*/dbms_output.put_line(用户编号:|var_UserRecord.UserId|,用户名:|var_UserRecord.UserName);ENDLOOP;END;-结束程序体,10.2存储过程管理,过程函数程序包,过程,CREATEPROCEDURE语句来创建过程:CREATEORREPLACEPROCEDUREIS|ASBEGINEND;,过程,【例】创建示例过程ResetPwd,此过程的功能是将表Users中指定用户的密码重置为111111:CREATEORREPLACEPROCEDUREUserMan.ResetPwd(UserIdINNUMBER)ASBEGINUPDATEUsersSETUserPwd=111111WHEREUserId=UserId;END;,过程,存储过程管理,过程,添加存储过程,过程,修改存储过程,函数,CREATEFUNCTION语句来创建函数:CREATEORREPLACEFUNCTIONRETURNIS|ASBEGINRETURNEND;,函数,【例】下面介绍一个示例函数GetPwd,此函数的功能是在表Users中根据指定的用户名返回该用户的密码信息:CREATEFUNCTIONUserMan.GetPwd(nameINUsers.UserName%Type)RETURNUsers.UserPwd%TypeASoutpwdUsers.UserPwd%Type;BEGINSELECTUserPwdINTOoutpwdFROMUsersWHEREUserName=|name|;RETURNoutpwd;END;,函数,函数管理,函数,添加函数,函数,修改函数,程序包,CREATEPACKAGE语句来创建包的说明部分:CREATEORREPLACEPACKAGEIS|ASEND;,程序包,【例】下面介绍一个示例创建程序包MyPack,它包含前面2小节中的过程ResetPwd和函数GetPwd:CREATEORREPLACEPACKAGEUserMan.MyPackISPROCEDUREResetPwd(UserIdINNUMBER);FUNCTIONGetPwd(nameINUsers.UserName%Type)RETURNUsers.UserPwd%Type;ENDMyPack;,程序包,程序包管理,程序包,添加程序包,程序包,CREATEPACKAGEBODY语句来创建包体部分:CREATEPACKAGEBODYIS|ASEND;,程序包,【例】下面创建程序包MyPack的包体体部分:CREATEPACKAGEBODYUserMan.MyPackISPROCEDUREResetPwd(UserIdINNUMBER)ASBEGINUPDATEUsersSETUserPwd=111111WHEREUserId=UserId;END;FUNCTIONGetPwd(nameINUsers.UserName%Type)RETURNUsers.UserPwd%TypeASoutpwdUsers.UserPwd%Type;BEGINSELECTUserPwdINTOoutpwdFROMUsersWHEREUserName=|name|;RETURNoutpwd;END;ENDMyPack;,程序包,程序包管理查看MyPack程序包体,程序包,添加程序包,程序包,调用程序包中的过程.调用程序包中的函数:.【例】调用UserMan.MyPack.GetPwd函数,返回指定用户的密码信息:SETServerOutputON;DECLAREvarPwdUsers.UserPwd%Type;BEGINvarPwd:=UserMan.MyPack.GetPwd(Admin);dbms_output.put_line(varPwd);END;,程序包,DROPPACKAGEBODY命令删除程序包体:DROPPACKAGEBODYUserMan.MyPack;DROPPACKAGE命令删除程序包的说明部分:DROPPACKAGEUserMan.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 消费者权益保障综合服务承诺书3篇
- 六年级上册语文第七单元教案设计
- 工程设计与流程工具
- 教学效果评估与学生学习反馈报告
- 文化交流互鉴真诚合作承诺书(4篇)
- 2025医疗器械临床试验服务市场前沿解读及竞争临床试验中心分析及行业伦理研究进展报告
- 2025医疗健康领域市场分析及创新技术评估与资源配置策略研究报告
- 2025医疗健康行业市场现状商业模式研究及投资评估发展报告
- 人才招聘与面试标准化工具集
- 2025医疗健康管理平台市场潜力深度分析及未来趋势与投资策略研究报告
- 新能源产业2025年私募股权投资热点:退出策略与风险控制分析报告
- 热管真空管太阳能集热器测试报告
- 肾挫裂伤护理
- 公司大米策划方案
- 矿山机电运输安全知识培训
- JJG(烟草)30-2016卷烟端部落丝测定仪检定规程振动法
- 邮政社招考试试题及答案
- 2025民宿装修合同
- 基于BIM技术的市政工程设计试题及答案
- 低钾血症诊疗与护理要点
- 《放射诊疗许可讲解》课件
评论
0/150
提交评论