游标:
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;