Oracle的游标
作用:遍历结果集,处理sql语句执行出来的多余数据
隐式游标
数据库已经定义好的,在执行sql语句的时候自动打开
常用的几种
%found 执行语句后有数据返回
%notfound 在没有数据返回的时候
%rowfound 执行玩sql语句后影响的行数
%isopen 游标是否打开 默认为false
--隐式游标
begin
update emp set ename='xxx' where empno=7788;
--返回的是执行sql语句的结果
dbms_output.put_line(SQL%rowcount);
end;
显式游标
自己定义的游标,用于处理多行数据
--声明游标
declare
--游标 游标名 is 处理什么的
cursor myc is select * from emp;
myr emp%rowtype;--声明放游标值的变量
begin
--打开游标
open myc;
--循环的提取
loop
--提取值
fetch myc into myr;
--循环结束的条件
exit when myc%notfound;
dbms_output.put_line(myr.empno||'员工姓名'||myr.ename);
end loop;
end;
--带参数的游标
--查询emp表中 部门编号为多少的员工信息
--声明游标
declare
cursor myc(dno number) is select * from emp where deptno=dno;
myr emp%rowtype;
begin
--打开游标
open myc(20);
loop
fetch myc into myr;
--循环的条件 游标里面没有值,就结束循环
exit when myc%notfound;
dbms_output.put_line(myr.empno||'员工姓名'||myr.ename);
end loop;
end;
--for循环遍历游标 for循环会简单一些
declare
cursor myc is select * from emp;
begin
for i in myc loop
dbms_output.put_line(i.empno||',员工姓名'||i.ename);
end loop;
end;
--游标的嵌套
--查询每个部门的名称以及该部门下的员工信息(游标的嵌套)
--ACCOUNTING
--7782 CLARK
--7839 KING
--RESEARCH
--员工编号 员工名称
declare
cursor mydc is select * from dept;
mydr dept%rowtype;
--声明接收员工的变量
cursor myec(dno number) is select * from emp where deptno=dno;
myer emp%rowtype;
begin
open mydc;
loop
fetch mydc into mydr;
exit when mydc%notfound;
dbms_output.put_line(mydr.dname);
open myec(mydr.deptno);
loop
fetch myec into myer;
exit when myec%notfound;
dbms_output.put_line(myer.empno||' '||myer.ename);
end loop;
close myec;
end loop;
end;
--for循环处理游标嵌套
declare
cursor mydc is select * from dept;
cursor myec(dno number) is select * from emp where deptno=dno;
begin
for i in mydc loop
dbms_output.put_line(i.dname);
for j in myec(i.deptno) loop
dbms_output.put_line(j.empno||' '||j.ename);
end loop;
end loop;
end;
ref游标
--ref游标
--自己定义游标类型
declare
type myt is ref cursor;
myc myt;--游标名 游标类型
myr emp%rowtype;
begin
--打开游标
open myc for select * from emp;
loop
--取值
fetch myc into myr;
exit when myc%notfound;
dbms_output.put_line(myr.empno||' '||myr.ename);
end loop;
end;
--查询部门编号为20的员工信息
declare
type myt is ref cursor;
myc myt;--声明游标
myr emp%rowtype;--声明存储值的
dno number(20);--声明部门编码
begin
dno:=20;
open myc for select * from emp where deptno=dno;
loop
fetch myc into myr;
exit when myc%notfound;
dbms_output.put_line(myr.empno||' '||myr.ename);
end loop;
end;