oracle之游标

Oracle会创建一个存储区域,被称为上下文区域,用于处理SQL语句,其中包含需要处理的语句,例如所有的信息,行数处理,等等。

游标是指向这一上下文的区域。 PL/SQL通过控制光标在上下文区域。游标持有的行(一个或多个)由SQL语句返回。行集合光标保持的被称为活动集合。

可以命名一个光标,它可以在程序中获取和处理SQL语句,一次返回的行引用。有两种类型的游标:

  隐式游标

  显式游标

隐式游标被用于描述执行的SQL命令,PL/SQL中出现的SQL语句,oracle都会自动的为其分配一段私有的内存空间,也就是私有游标区域。

隐式游标:select * into emp from employees where id=200

显式游标由开发人员通过程序显式控制,用于从表中取出多行数据,并将多行数据一行一行单独进行处理。

显示游标的使用:

    可以用于暂存查询取出的多行结果

    按行处理查询返回的多行结果

    在PL/SQL块中通过循环手动控制游标

游标具有属性(下面为属性的作用)
测试SQL 命令的结果
在PL/SQL中类似于使用函数

通过使用游标的属性,获取游标的状态信息:
属性 类型 描述
%ISOPEN Boolean 如果游标打开,则为TRUE
%NOTFOUND Boolean 如果最近的提取没有返回一条记录,则为TRUE
%FOUND Boolean 一直为TRUE ,直到最近提取没有取回行记录
%ROWCOUNT Number 到目前为止,提取的总行数
后面用循环拿到所有数据的时候会用到属性

游标的使用

游标的使用包含几个内容:声明打开获取数据关闭游标4个步骤

声明游标

声明游标定义游标的名称和相关的SELECT语句 在DECLARE下声明。

CURSOR cursor_name IS select_statement;
在游标声明中,不要包含INTO 子句。
 案例:
  cursor emp_cursor is
  select employee_id,first_name
  from employees ;

打开游标

打开游标游标分配内存,使得它准备取的SQL语句转换成它返回的行。例如,我们将打开上述定义的游标如下:

打开游标将执行查询和取出结果集

OPEN cursor_name;

不论查询有没有返回记录,都不会引起异常

在一次取操作后,通过使用游标属性进行测试游标状态

OPEN emp_cursor;

获取游标

检索当前记录的值到输出变量中。

    FETCH cursor_name INTO variable1, variable2,... ;

   变量应该与游标字段个数相同

   变量与字段顺序也应该一一对应

   测试判断游标是否还包含更多的数据行

例如:

      fetch emp_cursor into v_empno,v_ename;

   dbms_output.put_line(v_empno||v_ename);

关闭游标

关闭游标来释放分配的内存

CLOSE cursor_name;

如果需要,必须重新打开游标

一旦游标已经关闭,不能再提取数据。

案例1:使用游标拿到一个员工的first_name,salary

--需求:使用游标拿到员工的first_name,salary

declare

   firstName employees.first_name%type;

   salary employees.salary%type;

   -- 定义一个游标 (注意:这里可以拿到多行的结果)

   cursor my_cursor isselect first_name,salary from employees;

begin

   -- 打开游标

   open my_cursor;

        -- 获取一个游标中的数据【属于使用移动光标,取值】

        fetch my_cursor into firstName,salary;

    dbms_output.put_line(firstName||'  '||salary);

   --关闭游标

   close my_cursor;

end;

使用循环拿到游标数据

一:使用简单循环打印所有员工的值

declare

   -- 定义emp类型

   emp employees%rowtype; //列类型

   -- 定义一个游标:拿到所有员工

   cursor my_corsor is select * from employees;

begin

  -- 打开游标

  open my_corsor;

  --循环开始打印游标

 loop

       -- 移动光标并获取相应的数据

       fetch my_corsor into emp;

       -- 如果没有相应数据则离开

       exit when my_corsor%notfound;

       -- 没有离开代表有数据,则可以打印展示出来

       dbms_output.put_line(emp.first_name||'  '|| emp.salary);  

 end loop;

 --关闭游标

  close my_corsor;

end;

二:使用for循环打印所有员工的值

PL/SQL语言提供了游标的for循环语句。自动的执行游标的open,fetch和close。当进入循环后,游标for循环语句会自动的打开游标,并提取第一行数据,当程序处理完当前数据后,自动提取下一行数据。当结果集中的内容提取完毕后,自动关闭游标。

格式:

    FOR variables IN cursor_name(value,value...) LOOP

       --处理语句

    END  LOOP;

 使用:

declare

      -- 定义一个游标

      cursor cur_emp  is select * from emp where department_id=100;

begin

  -- 循环这个游标 [自动打开,fetch,关闭]

  -- 当我们把这个游标放到这个for循环的时候,它就会自动打开游标

  -- for循环每次取值,都会自动 fetch

  -- 自己监控当游标的状态为notfound的时候, 就退出循环,关闭游标

  for v_emp in cur_emp

    loop

      dbms_output.put_line(v_emp.first_name ||' '|| v_emp.salary);

    end loop;

end;

原文地址:https://www.cnblogs.com/spdboke/p/6872595.html