版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第10章 游标、存储过程和触发器 课程描画引见Oracle数据库程序设计中经常会用到的3个概念,即游标、存储过程和触发器。本章知识点 游标 存储过程管理 触发器管理 游标 游标的根本概念 游标控制语句 游标属性 游标FOR循环 游标的根本概念 游标表示图 游标的根本概念运用显式游标 1声明游标。2翻开游标。3读取数据。4封锁游标。游标的根本概念隐式游标 【例】运用SELECT语句声明隐式游标,从HR.Departments表中读取Department_name字段的值到变量DepName:SET ServerOutput ON;DECLARE DepName HR.Departments.De
2、partment_Name%Type;BEGINSELECT Department_name INTO DepNameFROM HR.DepartmentsWHERE Department_ID=10;dbms_output.put_line(DepName);END;类型描画符游标控制语句 1声明游标语句CURSOR:DECLARE CURSOR () IS;【例】声明一个游标MyCur,读取指定类型的用户信息:DECLARE CURSOR MyCur(varType NUMBER) IS SELECT UserId, UserName FROM Users WHERE UserType =
3、 varType;游标控制语句2翻开游标语句OPEN:OPEN () ;【例】翻开游标MyCur,读取类型为1的用户信息:OPEN MyCur(1);游标控制语句3游标取值语句FETCH。游标取值语句FETCH的根本语法构造如下:FETCH INTO ;【例】在翻开的游标MyCur的当前位置读取数据:FETCH MyCur INTO varI,d varName;4封锁游标语句CLOSE:CLOSE ;【例】封锁游标MyCur:CLOSE MyCur;游标控制语句【例】下面引见一个完好的游标运用实例:/* 翻开显示方式 */SET ServerOutput ON; DECLARE -开场声明部
4、分 varId NUMBER; -声明变量,用来保管游标中的用户编号 varName VARCHAR2(50); -声明变量,用来保管游标中的用户名 -定义游标, varType为参数, 指定用户类型编号 CURSOR MyCur(varType NUMBER) IS SELECT UserId, UserName FROM Users WHERE UserType = varType;BEGIN -开场程序体 OPEN MyCur(1); -翻开游标,参数为1,表示读取用户类型编号为1的记录 FETCH MyCur INTO varId, varName; -读取当前游标位置的数据 CLOS
5、E MyCur; -封锁游标 dbms_output.put_line(用户编号: | varId |, 用户名: | varName); -显示读取的数据END; -终了程序体游标属性 1%ISOPEN属性 【例】下面的代码演示当运用未翻开的游标时,将会出现错误:/* 翻开显示方式 */SET ServerOutput ON; DECLARE -开场声明部分 varName VARCHAR2(50); -声明变量,用来保管游标中的用户名 varId NUMBER; -声明变量,用来保管游标中的用户编号 -定义游标, varType为参数, 指定用户类型编号 CURSOR MyCur(varT
6、ype NUMBER) IS SELECT UserId, UserName FROM Users WHERE UserType = varType;BEGIN -开场程序体 FETCH MyCur INTO varId, varName; -读取当前游标位置的数据 CLOSE MyCur; -封锁游标 dbms_output.put_line(用户编号: | varId |, 用户名: | varName); -显示读取的数据END; -终了程序体游标属性【例】修正上面的程序,在运用游标之前,调用%ISOPEN属性判别游标能否翻开。/* 翻开显示方式 */SET ServerOutput O
7、N; DECLARE -开场声明部分 varName VARCHAR2(50); -声明变量,用来保管游标中的用户名 varId NUMBER; -声明变量,用来保管游标中的用户编号 -定义游标, varType为参数, 指定用户类型编号 CURSOR MyCur(varType NUMBER) IS SELECT UserId, UserName FROM Users WHERE UserType = varType;BEGIN -开场程序体 IF MyCur%ISOPEN = FALSE Then OPEN MyCur(2); END IF; FETCH MyCur INTO varId,
8、 varName; -读取当前游标位置的数据 CLOSE MyCur; -封锁游标 dbms_output.put_line(用户编号: | varId |, 用户名: | varName); -显示读取的数据END; -终了程序体游标属性2%FOUND属性和%NOTFOUND属性【例】%FOUND属性可以循环执行游标读取数据:/* 翻开显示方式 */SET ServerOutput ON; DECLARE -开场声明部分 varName VARCHAR2(50); -声明变量,用来保管游标中的用户名 varId NUMBER; -声明变量,用来保管游标中的用户编号 -定义游标, varTyp
9、e为参数, 指定用户类型编号 CURSOR MyCur(varType NUMBER) IS SELECT UserId, UserName FROM Users WHERE UserType = varType;BEGIN -开场程序体 IF MyCur%ISOPEN = FALSE Then OPEN MyCur(1); END IF; FETCH MyCur INTO varId, varName; -读取当前游标位置的数据 WHILE MyCur%FOUND -假设当前游标有效,那么执行循环 LOOP dbms_output.put_line(用户编号: | varId |, 用户名:
10、 | varName); -显示读取的数据 FETCH MyCur INTO varId, varName; -读取当前游标位置的数据 END LOOP; CLOSE MyCur; -封锁游标END; -终了程序体游标属性3%ROWCOUNT属性 【例】只读取前2行记录:/* 翻开显示方式 */SET ServerOutput ON; DECLARE -开场声明部分 varName VARCHAR2(50); -声明变量,用来保管游标中的用户名 varId NUMBER; -声明变量,用来保管游标中的用户编号 -定义游标, varType为参数, 指定用户类型编号 CURSOR MyCur(v
11、arType NUMBER) IS SELECT UserId, UserName FROM Users WHERE UserType = varType;游标属性BEGIN -开场程序体 IF MyCur%ISOPEN = FALSE Then OPEN MyCur(1); END IF; FETCH MyCur INTO varId, varName; -读取当前游标位置的数据 WHILE MyCur%FOUND -假设当前游标有效,那么执行循环 LOOP dbms_output.put_line(用户编号: | varId |, 用户名: | varName); -显示读取的数据 IF
12、MyCur%ROWCOUNT = 2 THEN EXIT; END IF; FETCH MyCur INTO varId, varName; -读取当前游标位置的数据 END LOOP; CLOSE MyCur; -封锁游标END; -终了程序体游标FOR循环 【例】声明记录类型User_Record_Type和定义记录变量var_UserRecord:TYPE User_Record_Type IS RECORD ( UserId Users.UserId%Type, UserName Users.UserName%Type);var_UserRecord User_Record_Type;
13、游标FOR循环 【例】PL/SQL记录可以与游标结合运用:/* 翻开显示方式 */SET ServerOutput ON; DECLARE -开场声明部分/* 声明记录类型 */TYPE User_Record_Type IS RECORD ( UserId Users.UserId%Type, UserName Users.UserName%Type);/* 定义记录变量 */var_UserRecord User_Record_Type; -定义游标, varType为参数, 指定用户类型编号 CURSOR MyCur(varType NUMBER) IS SELECT UserId, U
14、serName FROM Users WHERE UserType = varType;游标FOR循环 BEGIN -开场程序体 IF MyCur%ISOPEN = FALSE Then OPEN MyCur(1); END IF; LOOP FETCH MyCur INTO var_UserRecord; -读取当前游标位置的数据到记录变量var_UserRecord EXIT WHEN MyCur%NOTFOUND; -当游标指向结果集结尾时退出循环 /* 显示保管在记录变量var_UserRecord中的数据 */ dbms_output.put_line(用户编号: | var_Use
15、rRecord.UserId |, 用户名: | var_UserRecord.UserName); END LOOP; CLOSE MyCur; -封锁游标END; -终了程序体游标FOR循环 【例】典型游标FOR循环的例子:/* 翻开显示方式 */SET ServerOutput ON; DECLARE CURSOR MyCur(varType NUMBER) IS SELECT UserId, UserName FROM Users WHERE UserType = varType;BEGIN -开场程序体 FOR var_UserRecord IN MyCur(1) LOOP /* 显
16、示保管在记录变量var_UserRecord中的数据 */ dbms_output.put_line(用户编号: | var_UserRecord.UserId |, 用户名: | var_UserRecord.UserName); END LOOP;END; -终了程序体10.2存储过程管理 过程 一种根本的存储过程,由过程名、参数和程序体组成。 函数 与过程类似,只是函数有前往值。 程序包 一组相关的PL/SQL过程和函数,由包名、阐明部分和包体组成。 FUNCTION,PROCEDURE和PACKAGE区别 function 和procedure是PL/SQL代码的集合,通常为了完成一个
17、义务。procedure 不需求前往任何值而function将前往一个值,Package是为了完成一个商业功能的一组function和proceudre的集合过程CREATE PROCEDURE语句来创建过程:CREATE OR REPLACE PROCEDURE IS | AS BEGIN END ;参数声明格式: IN | OUT | IN OUT :=过程【例】创建例如过程ResetPwd,此过程的功能是将表Users中指定用户的密码重置为111111:CREATE OR REPLACE PROCEDURE UserMan.ResetPwd( varUserId IN NUMBER)AS
18、BEGIN UPDATE Users SET UserPwd = 111111 WHERE UserId = varUserId;END;过程存储过程管理 过程添加存储过程 过程修正存储过程 函数 CREATE FUNCTION语句来创建函数:CREATE OR REPLACE FUNCTION RETURN IS | AS BEGIN RETURN END ;CREATE OR REPLACE PROCEDURE IS | AS BEGIN END ;函数 【例】下面引见一个例如函数GetPwd,此函数的功能是在表Users中根据指定的用户名前往该用户的密码信息:CREATE FUNCTIO
19、N UserMan.GetPwd( name IN Users.UserName%Type )RETURN Users.UserPwd%TypeASoutpwd Users.UserPwd%Type;BEGIN SELECT UserPwd INTO outpwd FROM Users WHERE UserName = name; RETURN outpwd;END;函数 函数管理 函数 添加函数 函数 修正函数 程序包 CREATE PACKAGE语句来创建包的阐明部分:CREATE OR REPLACE PACKAGE IS | AS END ;-可以包括类型、变量、过程、函数和游标的阐明
20、程序包【例】下面引见一个例如创建程序包MyPack,它包含前面2小节中的过程ResetPwd和函数GetPwd:CREATE OR REPLACE PACKAGE UserMan.MyPackISPROCEDURE ResetPwd( UserId IN NUMBER);FUNCTION GetPwd ( name IN Users.UserName%Type )RETURN Users.UserPwd%Type;END MyPack;程序包程序包管理 程序包添加程序包 程序包CREATE PACKAGE BODY语句来创建包体部分:CREATE PACKAGE BODY IS | AS EN
21、D ;程序包【例】下面创建程序包MyPack的包体体部分:CREATE PACKAGE BODY UserMan.MyPackISPROCEDURE ResetPwd( varUserId IN NUMBER)ASBEGIN UPDATE Users SET UserPwd = 111111 WHERE UserId = varUserId;END;FUNCTION GetPwd( name IN Users.UserName%Type )RETURN Users.UserPwd%TypeASoutpwd Users.UserPwd%Type;BEGIN SELECT UserPwd INTO
22、 outpwd FROM Users WHERE UserName=|name|; RETURN outpwd;END;END MyPack;程序包 程序包管理查看MyPack程序包体 程序包添加程序包 程序包调用程序包中的过程.调用程序包中的函数:. 【例】调用UserMan.MyPack.GetPwd函数,前往指定用户的密码信息:SET ServerOutput ON;DECLARE varPwd Users.UserPwd%Type;BEGIN varPwd:= UserMan.MyPack.GetPwd(Admin); dbms_output.put_line(varPwd);END;程序包 DROP PACKAGE BODY命令删除程序包体:DROP PACKAGE
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 26秋一年级上册数学应用题考点专项练习
- 3G网络下视频传输技术的深度剖析与仿真验证
- 35CrMo基扩散偶界面扩散层的微观机制与性能关联研究
- 2μm激光器正交偏振与自锁模输出特性的多维探究与前沿洞察
- 20世纪上半叶中国服装造型结构变革:文化视角下的历史审视
- 中学校教学及辅助用房新建项目可行性研究报告模板-立项备案
- 交通工程施工技术交底
- 预制阳台安装施工方案
- 钢管混凝土结构施工方案-技术交底
- 公司安全卫生食品安全管理制度模板
- 2026年领导干部任前廉政法规知识竞赛试题库及答案
- 2026年贵阳花溪资本运营管理有限公司社会公开招聘14人考试备考题库及答案详解
- 2026中国社会科学院招聘土木工程师5人(北京)笔试备考试题及答案详解
- 成都未来科技城发展服务局2026年社会招聘笔试题库附参考答案详解【模拟题】
- 烧结多孔砖生产施工方案及技术措施
- 矿泉水授权销售合同
- 山东能源定向委培考试题
- 2025广东省风力发电有限公司山西分公司招聘7人笔试历年难易错考点试卷带答案解析
- 2025~2026学年安徽合肥市第四十五中学九年级上学期期末考试化学试卷
- T∕IAC CAMRA 50-2024 事故汽车常用零部件修复与更换判别规范
- 惠州市广东惠州市生态环境局博罗分局和博罗县污染防治攻坚战总指挥部办公室招聘编笔试历年参考题库典型考点附带答案详解
评论
0/150
提交评论