游标逐行处理查询结果,以编程的方式访问数据,它实际上是一个指针,它在一段Oracle存放数据查询结果集或数据操作结果集的内存中(数据的缓存区),游标就是指向这个缓冲区的一个指针。

游标的类型:

1、隐式游标:在 PL/SQL 程序中执行DML SQL 语句时自动创建隐式游标,名字固定叫sql。

2、显式游标:显式游标用于处理返回多行的查询。

3、REF 游标:REF 游标用于处理运行时才能确定的动态 SQL 查询的结果。

显式游标:

显式游标在 PL/SQL 块的声明部分定义查询,该查询可以返回多行

显式游标,就是自己定义的游标

显式游标的使用:

(1)游标变量的声明

     cursor 游标名 is select语句;

     cursor cur_emp is select * from emp where sal<3000;

 (2)打开游标

     open 游标名称;

     open cur_emp;

  (3)fetch into 当前游标指向下一条数据并把数据保存在一个变量中

     fetch 游标变量  into 变量  

     fetch cur_emp  into v_emp;

  (4)关闭游标

     close 游标名称

     close cur_emp;

如:

--使用游标打印所有员工信息

declare

   --声名一个游标变量,指向所有员工的信息

select * from emp;

cursor c_emp is select * from emp;

   --声名一个emp%rowtype类型的变量用来保存游标中的一条记录

v_emp emp%rowtype;

begin

   --打开游标

   open c_emp;

   --遍历游标

   loop

     --fetch into游标指向下一条数据,并保存数据到变量v_emp中

     fetch c_emp into v_emp;

     --判断游标是否还有数据,如果没有数据,就退出循环

     exit when c_emp%notfound;

     --把这条员工信息打印出来

     dbms_output.put_line(v_emp.empno||','||v_emp.ename||','||v_emp.job||','||v_emp.sal||','||v_emp.deptno);

   end loop;

   --关闭游标

   close c_emp;

end;

--使用游标打印所有员工的信息

declare

   --声名一个游标变量指向所有员工的集合

   cursor c_emp is select * from emp;

   --声名一个变量用来保存游标的一条记录

   v_emp emp%rowtype;

begin

   --打开游标

   open c_emp;

   --执行一次fetch into 让游标指向第一条数据

   fetch c_emp into v_emp;

   --while循环,条件是循环条件

   while c_emp%found loop

      --打印员工信息

      dbms_output.put_line(v_emp.ename||','||v_emp.job||','||v_emp.sal||','||v_emp.deptno);

      --fetch into将游标指向下一条数据

      fetch c_emp into v_emp;

   end loop;

   dbms_output.put_line(c_emp%rowcount||'');

   --关闭游标

   close c_emp;

end;

for循环会自动打开游标、关闭游标,并且自动会让游标指向一条记录

--使用游标打印所有员工的信息

declare

   --声名一个游标变量指向所有员工的集合

   cursor c_emp is select * from emp;

begin

   for v_emp in c_emp loop

       --打印员工信息

dbms_output.put_line(v_emp.ename||','||v_emp.job||','||v_emp.sal||','||v_emp.deptno||','||c_emp%rowcount);

   end loop;

end;

隐式游标:

在PL/SQL中使用DML语句时自动创建隐式游标。

隐式游标自动声明、打开和关闭,其名为 SQL。

通过检查隐式游标的属性可以获得最近执行的DML 语句的信息。

如: 

declare

  v_emp emp%rowtype;

begin

   update emp set comm=100 where deptno=&deptno;

   dbms_output.put_line('修改的数据条数:'||sql%rowcount);

   if sql%found then

       dbms_output.put_line('aaaaaaaaaaaaaaa');

   end if;

   delete from emp where deptno=&dno;

   dbms_output.put_line('删除了'||sql%rowcount||'条数据');

end;

REF游标:

REF 游标和游标变量用于处理运行时动态执行的 SQL 查询

创建游标变量需要两个步骤:

1.声明 REF 游标类型

语法:type 类型名称 is ref cursor;

2.声明 REF 游标类型的变量

 语法  变量名称 游标变量类型;

使用:  open 游标变量 for select 语句;

 如:

--查询所有的员工信息

declare

  --声明 REF 游标类型

  type c_type is ref cursor;

  --声名REF游标类型变量

  cur c_type;

  --声名一个变量保存emp表的信息

  v_emp emp%rowtype;

begin

  open cur for select * from emp;

  loop

     fetch cur into v_emp;

     exit when cur%notfound;

     dbms_output.put_line(v_emp.ename);

  end loop;

  close cur;

end;