oracle游标的使用.ppt

上传人:sh****n 文档编号:6394797 上传时间:2020-02-24 格式:PPT 页数:29 大小:381KB
返回 下载 相关 举报
oracle游标的使用.ppt_第1页
第1页 / 共29页
oracle游标的使用.ppt_第2页
第2页 / 共29页
oracle游标的使用.ppt_第3页
第3页 / 共29页
点击查看更多>>
资源描述
第十二章光标的使用 光标的概念 Oracle光标是一种用于轻松的处理多行数据的机制 当PL SQL光标查询返回多行数据时 这些记录组被称为结果集 Oracle将这种活动集存储在您创建的显示定义的已命名的光标中 没有光标 Oracle开发人员必须单独地 显式地取回并管理光标查询选择的每一条记录 12 1光标的定义与使用 显式光标处理需四个PL SQL步骤 cursor光标名称is查询语句 open光标名称 Fetch光标名称into变量列表 Close光标名称 12 1光标的定义与使用 例1 declarecursorc1isselectename salfromempwhererownum 11 v enamevarchar2 10 v salnumber 7 2 beginopenc1 fetchc1intov ename v sal whilec1 foundloopdbms output put line v ename to char v sal fetchc1intov ename v sal endloop closec1 end 12 1光标的定义与使用 2 光标属性 found布尔型属性 当最近一次读记录时成功返回 则值为true nofound布尔型属性 与 found相反 isopen布尔型属性 当光标已打开时返回true rowcount数字型属性 返回已从光标中读取得记录数 12 1光标的定义与使用 3 参数化光标在声明光标时 将未确定的参数说明成变量 在使用光标时给出光标变量的具体值 相当于实参 使得语句可以按照给出的条件进行查询 12 1光标的定义与使用 例2 DECLARECursorc1 view patternvarchar2 ISSelectview namefromall viewsWhereview namelikeview pattern ANDrownum 10Orderbyview name Vnamevarchar2 40 BEGINForI1inc1 DBA loopDBMS OUTPUT PUT LINE I1 view name ENDloop END 12 1光标的定义与使用 处理隐式光标所有的SQL语句在上下文区内部都是可执行的 因此都有一个光标指向上下文区 此光标就是所谓的SQL光标 SQLcursor 与显式光标不同 SQL光标不被程序打开和关闭 12 1光标的定义与使用 例3 节自在线代码nomat1 sqlBEGINUPDATEroomsSETnumber seats 100WHEREroom id 99980 如果更新没有匹配则插入一新行IFSQL NOTFOUNDTHENINSERTINTOrooms room id number seats VALUES 99980 100 ENDIF END 12 1光标的定义与使用 例4 节自在线代码nomat2 sqlBEGINUPDATEroomsSETnumber seats 100WHEREroom id 99980 如果更新没有匹配则插入一新行IFSQL ROWCOUNT 0THENINSERTINTOrooms room id number seats VALUES 99980 100 ENDIF END 12 1光标的定义与使用 例5 节自在线代码nodata sqlDECLAREV roomdatarooms ROWTYPE BEGINSelect intov roomdatafromroomsWhereroom id 1 IFSQL NOFOUNDTHENINSERTINTOtemp table char col VALUES NotFound ENDIF EXCEPTIONWHENNO DATA FOUNDTHENINSERTINTOtemp table char col VALUES NotFound exceptionhandle END 12 2光标循环 在高级语言编程和PL SQL编程中 经常使用 提取循环 fetchloop 来实现逐行提取所需数据的方法 12 2光标循环 LOOP和ENDLOOP来实现简单循环 DECLAREV studentIDstudents id TYPE V firstNamestudents first name TYPE V LastNamestudents last name TYPE CURSORc HistoryStudentsISSELECTid first name last namefromstudentsWHEREmajor History BEGINOpenc HistoryStudents LOOPFETCHc HistoryStudentsINTOv studentID v FirstName V LastName EXITWHENc HistoryStudents NOFOUND INSERTINTOregistered students student id department course VALUES v StudentsID HIS 301 INSERTINTOtemp table num col char col VALUES v StudentID v FirstName v lastName ENDLOOP CLOSEc HistoryStudents COMMIT END 12 2光标循环 WHILE循环与简单循环不一样的是 while循环是先判断后执行 只有满足条件才能执行其循环体内的语句 而简单循环至少执行一次 declarev enameemp ename type v empnoemp empno type v salemp sal type v rownuminteger cursorc salisselectempno ename salfromempwheresal 3000 beginopenc sal v rownum c sal rowcount dbms output put line to char v rownum fetchc salINTOv empno v ename v sal whilec sal foundloopdbms output put line 员工信息为 to char v empno v ename 的工资为 to char v sal fetchc salINTOv empno v ename v sal exitwhenc sal notfound endloop 12 2光标循环 v rownum c sal rowcount dbms output put line to char v rownum closec sal end 最主要的作用 在前台的开发环境下 利用游标变量的值进行数据处理 12 2光标循环 12 2光标循环 12 2光标循环 12 2 3光标FOR循环DECLARECURSORc HistoryStudentsISSELECTid first name last nameFROMstudentsWHEREmajor History BEGIN FORv StudentDataINc HistoryStudentsLOOPINSERTINTOregistered students student id department course VALUES v StudentsID HIS 301 INSERTINTOtemp table num col char col VALUES v StudentID v FirstName v lastName 循环前隐含检查 NOFOUNDENDLOOP 自动关闭光标COMMIT END 12 2光标循环 关于NO DATA FOUND和 NOTFOUNDSELECT INTO语句触发NO DATA FOUND 当一个显式光标的where子句未找到时触发 NOFOUND 当UPDATE或DELETE语句的where子句未找到时触发SQL NOTFOUND 在光标的提取 Fetch 循环中要用 NOTFOUND或 FOUND来确定循环的退出条件 不要用NO DATA FOUND 12 3光标变量 前面所给出光标都是显式的光标 而且是静态的光标 Oracle从PL SQLRelease2 2版以后 声明的光标可以不是静态的 光标变量就是允许开发人员编写的程序在运行时与不同的语句相关联 光标变量在运行可以取不同的值 以达到灵活的目的 12 3光标变量 声明光标变量TYPEtype nameISREFCURSORRETURNreturn type 为光标变量分配存储空间EXECSQLALLCATE variable打开光标变量OPENcursor variableFORselect statements 关闭光标变量CLOSEcursor variable 实例见教材p118 学生训练案例 编写完成如下功能的pl sql程序 要求用游标完成 1 按部门编号从小到大的顺序输出雇员名字 工资以及工资与平均工资的差 2 已知每个部门有一个经理 编写程序 统计输出部门名称 部门总人数 总工资和部门经理 3 为所有雇员增加工资 工资在1000以内的增加30 工资在1000 2000之间的增加20 2000以上的增加10 学生训练案例 4 用游标for循环完成如下功能的pl sql程序 CLERK 和 manager 是emp表中job列的2个属性值 求出职员为CLERK和manager的平均工资 并输出每个职员的工资及与其所属job的平均工资的差值 注意 游标for循环示显示游标的一种快捷使用方式 它使用for循环依次读取结果集中的行数据 当form循环开始时 游标自动打开 不需要open 每循环一次系统自动读取游标当前行的数据 不需要fetch 当退出for循环时 游标被自动关闭 不需要使用close 使用游标for循环的时候不能使用open语句 fetch语句和close语句 否则会产生错误 学生训练案例 例如 DECALRECURSORc deptISSELECTdeptno dnameFROMdeptORDERBYdeptno CURSORc emp p deptVARACHAR2 ISSELECTename salaryFROMempWHEREdeptno p deptORDERBYenamev tot salaryEMP SALARY TYPE 学生训练案例 BEGINFORr deptINc deptLOOPDBMS OUTPUT PUT LINE Department r dept deptno r dept dname v tot salary 0 FORr empINc emp r dept deptno LOOPDBMS OUTPUT PUT LINE Name v ename salary v salary v tot salary v tot salary v salary ENDLOOP DBMS OUTPUT PUT LINE ToltalSalaryfordept v tot salary ENDLOOP END
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!