oracle中的游标,游标的概念与作用,游标的分类,游标的使用。

一,游标的概念与作用

   摘自百度百科:游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力。可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理。游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标可以被看作是一个查询结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成的一个临时文件,提供了在查询结果集中向前或向后浏览数据、处理结果集中数据的能力。有了游标,用户就可以访问结果集中任意一行数据,在将游标放置到某行之后,可以在该行或从该位置的行块上执行操作。

其实就是用于存放查询出来的多条记录的一个临时变量,我们可以从这个变量中取出我们需要的信息字段。

二,游标的分类

    游标有两种类型:显式游标和隐式游标。

  一般我们用到的SELECT...INTO...查询语句,一次只能从数据库中提取一行数据,对于这种形式的查询和DML操作,系统都会使用一个隐式游标。但是如果要提取多行数据,就需要由程序员定义一个显式游标,并通过与游标有关的语句进行处理。显式游标对应一个返回结果为多行多列的SELECT语句。 游标一旦打开,数据就从数据库中传送到游标变量中,然后应用程序再从游标变量中分解出需要的数据,并进行处理。

  简单的DML操纵语句和单行查询语句会使用隐式游标,这些语句分别是插入insert语句,更新update语句,删除delete语句,单行select查询语句。

当系统使用一个隐式游标时,可以通过隐式游标的属性来了解操作的状态和结果,进而控制程序的流程。隐式游标可以使用名字SQL来访问,但要注意,通过SQL游标名总是只能访问前一个DML操作或单行SELECT操作的游标属性。所以通常在刚刚执行完操作之后,立即使用SQL游标名来访问属性。

  游标的属性有以下四种

    1.SQL%ROWCOUNT    返回值为一个整型数字  代表DML语句成功执行的数据行数   

    2.SQL%FOUND   布尔型 值为TRUE代表插入、删除、更新或单行查询操作成功   

    3.SQL%NOTFOUND    布尔型 值为true表示插入、删除、更新或单行查询操作失败。

    4.SQL%ISOPEN  布尔型 DML执行过程中为真,结束后为假  

三,游标的使用

    隐式游标的使用主要就是以上的四种属性的使用,使用它们来进行一些流程控制。

    显示游标的声明和使用

      cursor cursor_name[ 参数1 参数类型,参数2,参数类型...]  is select 语句;

    游标的使用步骤:

      1.声明一个游标

      2.打开游标 open 游标名(参数1,参数2..);

      3.使用循环遍历游标,从游标中取值。fetch 游标名 into 变量名,循环的退出条件是 游标名%notfound;

      4.关闭游标 close 游标名;

    游标的遍历(两种方式)

      1.使用loop循环遍历

        例如 :

            declare
              cursor outemp is  select * from emp;
              ouem emp%rowtype;//也可以是%type,但是必须和表中的类型一致。
            begin
              open outemp;
              loop
                fetch outemp into ouem;
                exit when outemp%notfound;//退出条件
                dbms_output.put_line(ouem.ename || ' ' ||ouem.sal);
              end loop;
              close outemp;
            end;

      2.使用for循环遍历游标

        例如:

            declare

              cursor outfor is  select * from emp;
            
begin
              for vrow in outfor loop
                dbms_output.put_line(vrow.ename || ' ' || vrow.sal);
              end loop;
            end;

      使用for循环遍历游标的好处:1.不用声明额外的变量,2.不用打开和关闭游标,3.写法简单。

    系统引用游标

      1. 声明游标 : 游标名 sys_refcursor
      2. 打开游标: open 游标名 for select语句;
      3. 从游标中取数据
      4. 关闭游标

     例如:--输出员工表中所有的员工姓名和工资

        declare
          vrows sys_refcursor;
          vrow emp%rowtype;
        begin
          
open vrows for select * from emp;
          loop
          
  fetch vrows into vrow;
            exit when vrows%notfound;
            dbms_output.put_line('姓名:'||vrow.ename ||' 工资: ' || vrow.sal);
          end loop;
          close vrows;
        end;
以上就是游标的基础,使用游标时一定要记得关闭游标,还有就是在定义变量时需要注意定义的类型必须要和表中的字段类型一致,否则会出错。