天学通Oracle第二版]第9章游标.ppt_第1页
天学通Oracle第二版]第9章游标.ppt_第2页
天学通Oracle第二版]第9章游标.ppt_第3页
天学通Oracle第二版]第9章游标.ppt_第4页
天学通Oracle第二版]第9章游标.ppt_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

1、第9章 游标,Oracle编程中,可以使用函数、存储过程等,这很大程度上接近于编程语言。Oracle的本质还是作为一个数据库存在的,因此,Oracle也必须提方便地访问数据的方法。这正是游标概念的本质允许用户针对某个结果集进行逐行访问。本章重点介绍游标的概念,主要内容包括: 声明和使用显式游标; 使用隐式游标; 使用动态游标。,9.1 游标简介,游标类似于编程语言中的指针,游标可以进行位置的移动,以循环访问结果集中每条记录。通过游标可以方便的访问当前记录。 游标分两类:显式游标和隐式游标。显式游标可以被用户显式创建、打开、访问、关闭,即用户可以控制游标的整个生命周期。而隐式游标无需用户的全程控

2、制,即可进行访问。,9.2 显式游标,显式游标在使用时,应该遵循声明、打开、访问、关闭的步骤。本节将通过几个范例讲解如何创建和使用游标,9.2.1 声明游标,如同声明变量,声明游标也应该使用declare命令。游标的内容一般利用SQL查询语句来定义。因为游标的本质就是用来处理结果集中的每条记录。 declare cursor cu_student_name is select student_name from students; student_id number; -(1) student_name students.student_name%type; - (2) student stu

3、dents%rowtype; -(3) declare cursor cu_student(minAge in number, maxAge in number) is select * from students; where student_age= minAge and student_age=maxAge student students%rowtype;,9.2.2 使用游标,游标的使用主要有三个步骤:打开游标、通过游标获取数据和关闭游标。其中尤其需要注意的是关闭游标。当使用完游标之后,应该立即关闭,否则将会占用数据库资源,增加数据库负担。本小节将通过范例来讲述如何使用游标。 dec

4、lare cursor cu_student(minAge in number, maxAge in number) is select * from students where student_age=minAge and student_age=maxAge; student students%rowtype; begin open cu_student(19,20); fetch cu_student into student; while cu_student%found loop dbms_output.put_line(student.student_name | : | stu

5、dent.student_age | 岁); fetch cu_student into student; end loop; close cu_student; end;,9.3 隐式游标,隐式游标是相对于声明游标变量的显式游标而言的。显式游标通常使用declare命令来声明游标;而隐式游标则无需declare命令即可直接使用。隐式游标不能直接被用户控制和使用即不能执行打开(open),获取游标数据(fetch)、关闭(close)等。隐式游标有两种:使用Oracle预定义的名为SQL的隐式游标和使用cursor for loop来进行循环的隐式游标。,9.3.1 sql隐式游标,Oracl

6、e为每个PL/SQL的会话都定义了一个名为sql的游标变量。可以在PL/SQL Developer中直接调用该变量。 begin if sql%rowcount0 then dbms_output.put_line(sql游标变量的rowcount属性大于0); end if; end; declare student students%rowtype; begin update students set student_age = student_age -1 ; - fetch sql into student; dbms_output.put_line(共更新了 | sql%rowcou

7、nt | 条记录); end;,9.3.2 cursor for游标,sql游标可以应用于更新及删除数据表中的数据,为了能够处理select语句获得的记录集合,Oracle提供了另外一种隐式游标cursor for游标。利用该游标,用户可以像使用普通循环语句一样来循环处理SELECT语句所获得的每一条记录。 begin for student in (select * from students) loop dbms_output.put_line(student.student_id | : | student.student_name | : | student.student_age |

8、 岁); end loop; end;,9.3.3 隐式游标和显式游标,隐式游标和显式游标都可以实现对结果集的操作,但是,相比之下,隐式游标不需要用户控制游标的声明、打开、获取和关闭,因此用户可以利用更少的代码实现同样的功能。而且,隐式游标的执行速度更快,在对游标的显式控制要求不高时,应尽量选择隐式游标。,9.4 游标属性,游标属性反映了游标的当前状态,游标属性对于PL/SQL编程有着极为重要的作用。例如逻辑判断等,都可以使用游标属性。本节将讲述4个常用的游标属性. found属性用于标识当前游标从结果中获取记录时,是否成功找到了记录。 not found属性是found属性的对立面。 row

9、count属性用于返回当前时刻已经获得了多少条记录。 isopen属性用于判断游标是否处于打开状态,如果游标打开,则返回true,否则,将返回false。 【范例9-14】,9.5 动态游标,无论显式游标还是隐式游标,都具有一个特点,即游标在打开时,其定义已经确定。在整个程序的运行过程中,游标定义不能进行更改。因此显式游标和隐式游标被称为静态游标。为了增加游标的灵活性,Oracle提供了另外一种游标动态游标,即其定义在游标声明时没有设定,在打开时,可以进行动态修改。 动态游标又分为两类:强类型动态游标和弱类型动态游标。,9.5.1 强类型动态游标,强类型动态游标是指,当游标声明时,虽未设定其查

10、询定义,但是已经指定了游标的返回类型。游标的返回类型,可以是Oracle内置类型,也可以是自定义类型。 声明一个强类型游标首先自定义一个ref cursor的游标类型,然后利用该自定义类型,声明一个游标变量。例如,现需一个打印学生信息的存储过程。用户可以向该存储过程传递一个年龄参数,该参数决定了打印哪些学生的信息。如果所传入的年龄参数小于等于0,则打印所有学生的信息;如果传入的参数大于0,则打印年龄与参数相同的学生的信息。 【范例9-15】,9.5.2 弱类型动态游标,众所周知,编程语言有强类型和弱类型之分,例如,VB、JavaScript为弱类型,在JavaScript中使用var关键字即可

11、声明一个变量,该变量既可以存储字符串也可以存储数字;而Java、C等属于强类型语句,变量类型在声明时确定,而且一旦确定将不能改变。弱类型动态游标的概念与此类似,在声明游标时不使用return关键字指定游标的返回类型,那么在以后的程序中,可以对其使用不同的返回类型。 【范例9-16】,9.5.3 比较两种动态游标,通过以上范例可知,强类型动态游标在使用时,必须声明其类型,在以后的使用过程中,虽然游标的定义可以修改,但是返回值类型是一定的。而弱类型则无需声明返回值类型,但在使用过程中,必须保证每次用于获取记录的类型都能够正确接收来自游标的数据,因此,这也存在着一定的风险。应尽量避免使用弱类型游标。

12、,9.6 本章实例,相对于显式游标,隐式游标往往被开发者忽略。而cursor for游标使用简单、方便,因此,更值得关注。 set serverout on; begin for student in (select * from students where student_age=18 order by student_age desc) loop dbms_output.put_line(student.student_name | : | student.student_age | 岁); end loop; end;,9.7 本章小结,本章讲述了Oracle中各种游标的使用。其中显式游标最符合用户的思维习惯声明游标、打开游标、操作游标、关闭游标。尤其需要注意的是,在使用游标结束之后,一定要执行关闭操作。而隐式游标

温馨提示

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

评论

0/150

提交评论