




已阅读5页,还剩42页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第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存储过程管理,过程一种基本的存储过程,由过程名、参数和程序体组成。函数与过程类似,只是函数有返回值。程序包一组相关的PL/SQL过程和函数,由包名、说明部分和包体组成。FUNCTION,PROCEDURE和PACKAGE区别function和procedure是PL/SQL代码的集合,通常为了完成一个任务。procedure不需要返回任何值而function将返回一个值,Package是为了完成一个商业功能的一组function和proceudre的集合,过程,CREATEPROCEDURE语句来创建过程:CREATEORREPLACEPROCEDUREIS|ASBEGINEND;参数声明格式:IN|OUT|INOUT:=,过程,【例】创建示例过程ResetPwd,此过程的功能是将表Users中指定用户的密码重置为111111:CREATEORREPLACEPROCEDUREUserMan.ResetPwd(varUserIdINNUMBER)ASBEGINUPDATEUsersSETUserPwd=111111WHEREUserId=varUserId;END;,过程,存储过程管理,过程,添加存储过程,过程,修改存储过程,函数,CREATEFUNCTION语句来创建函数:CREATEORREPLACEFUNCTIONRETURNIS|ASBEGINRETURNEND;,CREATEORREPLACEPROCEDUREIS|ASBEGINEND;,函数,【例】下面介绍一个示例函数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(varUserIdINNUMBER)ASBEGINUPDATEUsersSETUserPwd=111111WHEREUserId=varUserId;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命令删
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 通讯系统安装施工方案(3篇)
- 温棚棉被施工方案(3篇)
- 能源环保施工方案(3篇)
- 芜湖节日活动策划拍摄方案(3篇)
- 物业水工考试题库及答案
- 北京市门头沟区2023-2024学年八年级上学期期末质量监测数学考题及答案
- 北京市朝阳区2023-2024学年七年级上学期期末考试英语试卷及答案
- 安徽省铜陵市枞阳县2024-2025学年高三下学期高考第一模拟考试(一模)语文试题及答案
- 智慧之果香蕉700字15篇
- 仙人掌作文400字14篇
- 室内消火栓使用培训课件
- 抖音违规考试试卷
- 2015-2023年注册会计师考试《会计》真题合集(含答案及解析)共10套
- 2024年创业计划书篮球馆
- 内分泌科对患者糖尿病足预防知识不知晓原因分析品管圈鱼骨图
- 幼儿园卫生保健新生家长会课件
- 劳务合同通用模板电子下载
- 图书供货项目实施方案
- 护理礼仪与人际沟通第3版第三章护士服饰礼仪
- 血液中乙醇的测定顶空气相色谱法
- 物业承接查验移交资料清单
评论
0/150
提交评论