第5章Oracle PL/SQL使用游标获取

### 1. 游标的概述 ###

1. 隐式游标

   Oracle在执行时会自动为我们处理很多和游标相关的操作(声明游标、打开游标、提取记录关闭游标)。隐式游标是最简单最有效的获取数据的方式。
缺点:代码中存在大量相同或相似的select语句,不利于代码的重用。

2. 显式游标

显式游标用在需要获取多行记录的情况下
必须在手动的在PL/SQL块的声明部分定义
手动执行每个操作(打开、提取、数据、关闭)

3. 典型的查询操作

 a、 解析 (处理SQL语句的一个步骤是解析,确保SQL语句是有效的)
 b、 绑定(将PL/SQL程序中的变量与绑定变量关联)
  c、打开(打开游标)
 d、 执行(从SQL引擎中运行SQL语句)
 e、 提取(在游标的结果集中获取下一行)
 f、 关闭(关闭 游标)
游标获取数据库中的数据集合,然后打开提取每次提取后都会定位到下一行,然后从SGA中将数据拿到程序变量中,在此过程中是由Oracle自动将绑定变量与程序变量相关联。

4. 游标属性

      a、%found      如果记录成功获取,返回true,否则返回false
      b、%notfound   如果记录获取失败,返回true,否则返回false
      c、%rowcount   返回从游标中获取的记数
      d、%isopen     如果游标是打开的,返回true,否则返回false
      e、bulk_rowcount 返回forall语句更改的每个集合元素的记录数
      f、bulk_exception 返回forall语句更改的每个集合元素的记录的异常信息
注意:可以在PL/SQL代码中引用游标属性,不能在SQL语句中使用这些属性。

2. 使用显式游标

1. 声明显示游标
      cursor 游标名     is select 语句 for update;
                 游标名 指向的影响这一行类型%rowtype或type类型
2. 打开显式游标
      open 显式游标名;
3. 从显式游标中提取记录
      fetch 游标名 into 记录或变量列表;
4. 关闭显式游标
      close 游标名
  1. 游标for循环
    for 记录 in 游标名 loop
       执行语句
    end loop;
    

    使用引用游标:

    create or replace procedure proc_info(id in int) is
    type cur_info is ref cursor; –类型type 游标名 IS ref cursor引用游标
    cur_emp cur_info; –游标标量
    cur_emp_info emp%rowtype; –影响的整列的数据
    begin
    open cur_emp for – 打开游标
    select from emp where empno=id;
    loop
    fetch cur_emp into cur_emp_info; –从游标中提取数据
    exit when cur_emp%notfound; –退出条件没有记录就退出
    dbms_output.put_line(‘ID:’||cur_emp_info.empno|| ‘姓名:’||cur_emp_info.ename ||’工资:’||v_vv.sal);
    end loop;
    close cur_emp; –关闭游标
    end;
    call v_v(7499);
    select
    from emp;