PLSQL游标
什么是游标/光标【cursor】
指向查询结果集的指针,指向哪一行,提取哪一行的数据(PLSQL的游标默认指向结果集的第一行)。
类似于JDBC中的ResultSet对象的功能,从上向下依次获取每一记录的内容。
显示游标的四个属性
游标变量 %found: 当最近一次读入记录成功时返回true
游标变量 %notfound:当最近一次读入记录失败时返回true
游标变量 %isopen:判断游标是否已经打开
游标变量 %rowcount:返回已从游标中读取的记录数
隐示游标的四个属性,固定名称SQL
SQL%FOUND:判断SQL语句是否成功执行。当有作用行时为true,否则为false
SQL%NOTFOUND:判断SQL语句是否成功执行。当有作用行时为false,否则为true
SQL%ISOPEN:游标是否打开,当执行CURD时,Oracle会隐含地打开游标,且在该语句执行完毕或隐含地关闭,在隐式游标中,该值永远为false
SQL%ROWCOUNT:操作影响的行数
注意:必须在事务结束之前读取游标属性,只能读取最近的一次DML操作的游标状态
使用游标分为4个步骤
1、声明游标:cursor 游标变量 is 查询语句
2、打开游标:open 游标变量(不能重复打开游标)
3、提取数据:fetch 游标变量 into 变量1,变量2,.
4、关闭游标:close 游标变量
--使用无参光标cursor,查询所有员工的姓名和工资【如果需要遍历多条记录时,使用光标cursor,无记录找到使用cemp%notfound】
declare
--定义游标
cursor cemp is select ename,sal from emp;
--定义变量
vename emp.ename%type;
vsal emp.sal%type;
begin
--打开游标,这时游标位于第一条记录之前
open cemp;
--循环
loop
--向下移动游标一次
fetch cemp into vename,vsal;
--退出循环,当游标下移一次后,找不到记录时,则退出循环
exit when cemp%notfound;
--输出结果
dbms_output.put_line(vename||'————'||vsal);
end loop;
--关闭游标
close cemp;
end;
/
--使用带参光标cursor,查询10号部门的员工姓名和工资
declare
cursor cemp(pdeptno emp.deptno%type) is select ename,sal from emp where deptno=pdeptno;
pename emp.ename%type;
psal emp.sal%type;
begin
open cemp(&deptno);
loop
fetch cemp into pename,psal;
exit when cemp%notfound;
dbms_output.put_line(pename||'的薪水是'||psal);
end loop;
close cemp;
end;
/
--使用无参光标cursor,真正给员工涨工资,ANALYST涨1000,MANAGER涨800,其它涨400,要求显示编号,姓名,职位,薪水
declare
cursor cemp is select empno,ename,job,sal from emp;
pempno emp.empno%type;
pename emp.ename%type;
pjob emp.job%type;
psal emp.sal%type;
begin
open cemp;
loop
fetch cemp into pempno,pename,pjob,psal;
--循环退出条件一定要写
exit when cemp%notfound;
if pjob='ANALYST' then
update emp set sal = sal + 1000 where empno = pempno;
elsif pjob='MANAGER' then
update emp set sal = sal + 800 where empno = pempno;
else
update emp set sal = sal + 400 where empno = pempno;
end if;
end loop;
commit;
close cemp;
end;
/