Lesson-13.ppt_第1页
Lesson-13.ppt_第2页
Lesson-13.ppt_第3页
Lesson-13.ppt_第4页
Lesson-13.ppt_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、PL/SQL程序设计,成都信息工程学院 软件工程系,显示游标 Explicit cursors,PL/SQL程序设计,游标 Cursors,每一条被Oracle服务器执行的SQL语句都有一个独立的游标与之相关联: 隐式游标 Implicit cursors: 用于所有的DML和PL/SQL的SELECT语句。 显示游标 Explicit cursors: 被程序显示声明和命名。 所定义的SQL语句必须只包含select语句,并且不能用insert、update或delete关键字。 当select语句可能返回零或多于一行时,必须用显式游标。 当Select语句预计只返回一行时,隐式游标将做得更

2、好。,PL/SQL程序设计,显示游标的功能,Result Set,Current Row,7369SMITHCLERK 7566JONESMANAGER 7788SCOTTANALYST 7876ADAMSCLERK 7902FORDANALYST,PL/SQL程序设计,能够一行一行的处理多行查询结果。 能够记录和跟踪当前正在处理的行。 在PL/SQL块中允许程序手工控制游标。,控制显示游标(处理流程),声明游标,DECLARE,为查询打开游标,将结果提取到PL/SQL变量中,检测游标中是否还有数据(行),如果有数据(行),返回提取结果,No,关闭游标,PL/SQL程序设计,控制显示游标(Cu

3、rsor在内存中的变化过程),打开游标,从游标中提取(Fetch)一行,继续直到空,关闭游标,PL/SQL程序设计,声明游标,语法 在游标声明中不能包含INTO子句。 如果处理的行要求特定的顺序,在查询语句中可以使用 ORDER BY子句。,CURSOR cursor_name IS select_statement;,PL/SQL程序设计,声明游标,Example,DECLARE CURSOR c1 IS SELECT empno, ename FROM emp; CURSOR c2 IS SELECT * FROM dept WHERE deptno = 10; BEGIN .,PL/SQ

4、L程序设计,打开游标,语法 打开游标 执行查询。 活动集(查询结果的行的集合)被确定。 活动集的指针指向第一行。 如果查询没有返回行,不会抛出异常。 提取一行后,应该使用游标属性测试结果。,OPENcursor_name;,PL/SQL程序设计,从游标中提取数据,语法 提取当前行的值存储到PL/SQL变量中。 变量的类型必须与查询的选择列表的类型相兼容。 变量的数量必须与查询的选择列表的数量相同。 测试游标是否包含行。如果没有提取出值,则说明在处理的活动集中没有剩下需要处理的行并且不会有错误记录。,FETCH cursor_name INTOvariable1, variable2, . |

5、record_name;,PL/SQL程序设计,从游标中提取数据,Examples,DECLARE v_Department classes.department%TYPE; v_Course classes.course%TYPE; CURSOR c_AllClasses IS SELECT * FROM classes; v_ClassesRecord c_AllClasses%ROWTYPE; BEGIN OPEN c_AllClasses; FETCH c_AllClasses INTO v_ClassesRecord; FETCH c_AllClasses INTO v_Depart

6、ment, v_Course; END;,PL/SQL程序设计,错误,从游标中提取数据,Examples,FETCH c1 INTO v_empno, v_ename;,. OPEN defined_cursor; LOOP FETCH defined_cursor INTO defined_variables EXIT WHEN .; . - Process the retrieved data . END LOOP;,PL/SQL程序设计,关闭游标,语法 当所有的活动集都被检索以后,游标就应该关闭。 如果需要,可以在重新打开游标。 一旦关闭了游标,再从该游标提取数据就将是非法的。这样做会产

7、生一个Oracle错误。,CLOSEcursor_name;,PL/SQL程序设计,显示游标的属性,得到游标的状态信息,AttributeType Description %ISOPENBoolean Evaluates to TRUE if the cursor is open %NOTFOUNDBoolean Evaluates to TRUE if the most recent fetch does not return a row %FOUNDBoolean Evaluates to TRUE if the mostrecent fetch returns a row; comple

8、ment of %NOTFOUND %ROWCOUNTNumberEvaluates to the total number of rows returned so far,PL/SQL程序设计,显示游标的属性,游标属性的行为特征,PL/SQL程序设计,游标提取控制,使用LOOP循环实现显示游标多行数据处理。 反复使用Fetch来提取每一行数据。 使用%NOTFOUND属性来判断提取(Fetch)行是否不成功。 使用%FOUND显示游标属性来判断每一次提取(Fetch)操作是否成功。,PL/SQL程序设计,%ISOPEN属性,只有当游标打开是才能进行提取(Fetch)行的操作。 在进行提取(F

9、etch)行操作之前,使用%ISOPEN属性测试游标是否打开。 Example,IF NOT c1%ISOPEN THEN OPEN c1; END IF; LOOP FETCH c1.,PL/SQL程序设计,%NOTFOUND和%ROWCOUNT 属性,使用%ROWCOUNT游标属性,返回到目前位置由游标返回的行的数目。 使用%NOTFOUND游标属性,作为LOOP循环的退出条件。,PL/SQL程序设计,游标提取循环简单循环(LOOPEND LOOP),PL/SQL程序设计,DECLARE v_StudentID students.id%TYPE; v_FirstName students.

10、first_name%TYPE; v_LastName students.last_name%TYPE; CURSOR c_HistoryStudents IS SELECT id, first_name, last_name FROM students WHERE major = History; BEGIN OPEN c_HistoryStudents; LOOP FETCH c_HistoryStudents INTO v_StudentID, v_FirstName, v_LastName; EXIT WHEN c_HistoryStudents%NOTFOUND; INSERT IN

11、TO registered_students (student_id, department, course) VALUES (v_StudentID, HIS, 301); INSERT INTO temp_table (num_col, char_col) VALUES (v_StudentID, v_FirstName | | v_LastName); END LOOP; CLOSE c_HistoryStudents; COMMIT; END;,游标提取循环简单循环(WHILELOOPEND LOOP),PL/SQL程序设计,DECLARE CURSOR c_HistoryStuden

12、ts IS SELECT id, first_name, last_name FROM students WHERE major = History; v_StudentData c_HistoryStudents%ROWTYPE; BEGIN OPEN c_HistoryStudents; FETCH c_HistoryStudents INTO v_StudentData; WHILE c_HistoryStudents%FOUND LOOP INSERT INTO registered_students (student_id, department, course) VALUES (v

13、_StudentData.ID, HIS, 301); INSERT INTO temp_table (num_col, char_col) VALUES (v_StudentData.ID, v_StudentData.first_name | | v_StudentData.last_name); FETCH c_HistoryStudents INTO v_StudentData; END LOOP; CLOSE c_HistoryStudents; COMMIT; END;,游标和记录类型,从活动集中方便地提取一行数据存储到PL/SQL的记录类型变量中。 Example,. CURSO

14、R c1 IS SELECTempno, ename FROMemp; emp_recordc1%ROWTYPE; BEGIN OPEN c1; . . . FETCH c1 INTO emp_record;,PL/SQL程序设计,语法 游标的FOR循环能够便捷的处理显示游标。 游标的FOR循环隐式地打开、提取和关闭游标。也就是说用户不需明确的在程序中进行打开游标、提取取数据、测试数据的存在(%found)、关闭游标的操作。 用户不用定义存放数据的记录类型变量;存放数据的记录类型变量被隐式声明。,游标的FOR循环,FOR record_name IN cursor_name LOOP statement1; statement2; . . . END LOOP;,PL/SQL程序设计,游标的FOR循环,Example,DECLARE CURSOR c1 IS SELECT empno, ename FROM emp; BEGIN FOR emp_record IN c1 LOOP - implicit open and implicit fetch occur IF emp_record.empno = 7839 THEN . END LOOP; - implicit close occurs END;,PL/SQL程序设计,使用子查询的游标

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论