游标:

select、insert、update、delete语句时,oracle会在内存中为其分配上下文区(context area),即一个缓冲区。游标是指该区的一个指针,或是命名一个工作区,或是一种结构化的数据类型。为应用程序提供了一种对具有多行数据查询结果的每一行数据分别进行单独处理的方法。

 声明游标

cursor 游标名 is select查询语句; //把游标名与查询语句关联在一起

为查询打开游标

open 游标名; //如果select语句后面有for update的话,在打开游标时给当前cursor加上锁

将结果提取出来,存入PLSQL变量中

fetch 游标名 into 变量名;

while 游标名%found //结束条件

关闭游标

close 游标名;

关于游标的几个属性:

%found 返回boolean,当fetch语句还能够从游标中提取数据就返回true

%notfound 与上相反之

%isopen 判断游标是否处于打开状态

%rowcount 返回当前游标的指针的位移量(偏向第一条记录的位移量)



%found          %notfound

上一次fetch提取到了数据            true             false

上一次fetch没提取到了数据          false            true

没有执行fetch                      false            false


利用游标去查询emp_xb表中的所有的数据

*************************

第一种实方式:while循环

declare

cursor emp_cur is select * from emp_xb;

xu emp_xb%rowtype;

begin

open emp_cur;

fetch emp_cur into xu;

while emp_cur%found

loop

dbms_output.put_line(' id------------>' || xu.id );

dbms_output.put_line(' name---------->' || xu.name );

dbms_output.put_line(' lastname ----->' || xu.lastname );

fetch emp_cur into xu;

end loop;

close emp_cur;

end;

第二种实方式:loop循环

declare

cursor emp_cur is select * from emp_xb;

xu emp_xb%rowtype;

begin

open emp_cur;

loop

if emp_cur%notfound then exit;

end if;

dbms_output.put_line(' id------------>' || xu.id );

dbms_output.put_line(' name---------->' || xu.name );

dbms_output.put_line(' lastname ----->' || xu.lastname );

fetch emp_cur into xu;

end loop;

close emp_cur;

end;

第三种实方式:利用FOR语句使用COUSOR指针

declare

cursor cur_xb is select * from emp_xb;

begin

for emp in cur_xb loop

dbms_output.put_line('id===>' || emp.id);

dbms_output.put_line('firstname===>' || emp.name);

dbms_output.put_line('lastname===>' || emp.lastname);

end loop;

end;

注意:不声明游标的话,可直接把查询语句写在for循环的in后面,系统会帮你把open Cursor和fetch和close cursor全部都做了

游标带参数:

参数声明在游标声明的名字之后写在括号内,多个用逗号隔开,这时打开游标就需要传参

declare

cursor cur_xb(myname varchar2) is select * from emp_xb where name=myname;

begin

for emp in cur_xb('xu') loop

dbms_output.put_line('id===>' || emp.id);

end loop;

for emp in cur_xb('xiao') loop

dbms_output.put_line('firstname===>' || emp.firstname);

end loop;

end;