--显示游标 处理检索多行数据
--while循环
declare cursor emp_cursor
is
select * from emp where deptno=&部门编号;
v_emp_row emp%rowtype;
v_i integer:=0;
begin
if not emp_cursor%isopen then
open emp_cursor;
end if;
fetch emp_cursor into v_emp_row;
while emp_cursor%found loop
dbms_output.put_line(v_emp_row.empno||' '||v_emp_row.ename||' ');
fetch emp_cursor into v_emp_row;
v_i:=v_i+1;
end loop;
dbms_output.put_line('利用游标一共处理了'||v_i||'行数据。。。');
if emp_cursor%isopen then
close emp_cursor;
end if;
end emp_cursor;
--简单loop循环(无参)
declare cursor emp_cursor
is
select empno 员工编号,ename 员工姓名,nvl(sal,0) 员工工资,nvl(comm,0) 月奖金,12*(nvl(sal,0)+nvl(comm,0)) 年收入
from emp
where deptno=&部门编号
order by empno asc;
v_emprec emp_cursor%rowtype;
begin
if(not emp_cursor%isopen) then
open emp_cursor;
end if;
fetch emp_cursor into v_emprec;
loop
exit when emp_cursor%notfound;
dbms_output.put_line(v_emprec.员工编号);
fetch emp_cursor into v_emprec;
end loop;
if(emp_cursor%isopen) then
close emp_cursor;
end if;
end;
--for循环(无参)
declare cursor emp_cursor
is
select empno 员工编号,ename 员工姓名,nvl(sal,0) 员工工资,nvl(comm,0) 月奖金,12*(nvl(sal,0)+nvl(comm,0)) 年收入
from emp
where deptno=&部门编号
order by empno asc;
begin
for i in emp_cursor loop
dbms_output.put_line(i.员工编号);
end loop;
end;
--带参数游标的使用
--for循环(带参)
declare cursor emp_cursor(p_empno emp.empno%type)
is
select empno 员工编号,ename 员工姓名,nvl(sal,0) 员工工资,nvl(comm,0) 月奖金,12*(nvl(sal,0)+nvl(comm,0)) 年收入
from emp
where deptno=&部门编号
order by empno asc;
begin
for i in emp_cursor(&部门编号) loop
dbms_output.put_line(i.员工编号);
end loop;
end;
--while循环(带参)
declare cursor emp_cursor(p_empno emp.empno%type)
is
select empno 员工编号,ename 员工姓名,nvl(sal,0) 员工工资,nvl(comm,0) 月奖金,12*(nvl(sal,0)+nvl(comm,0)) 年收入
from emp
where deptno=&部门编号
order by empno asc;
v_emprec emp_cursor%rowtype;
begin
if(not emp_cursor%isopen) then
open emp_cursor(&部门编号);
end if;
fetch emp_cursor into v_emprec;
while(emp_cursor%found) loop
dbms_output.put_line(v_emprec.员工编号);
fetch emp_cursor into v_emprec;
end loop;
if(emp_cursor%isopen) then
close emp_cursor;
end if;
end;
--简单循环(带参)
declare cursor emp_cursor(p_empno emp.empno%type)
is
select empno 员工编号,ename 员工姓名,nvl(sal,0) 员工工资,nvl(comm,0) 月奖金,12*(nvl(sal,0)+nvl(comm,0)) 年收入
from emp
where deptno=&部门编号
order by empno asc;
v_emprec emp_cursor%rowtype;
begin
if(not emp_cursor%isopen) then
open emp_cursor(&部门编号);
end if;
fetch emp_cursor into v_emprec;
loop
exit when emp_cursor%notfound;
dbms_output.put_line(v_emprec.员工编号);
fetch emp_cursor into v_emprec;
end loop;
if(emp_cursor%isopen) then
close emp_cursor;
end if;
end;
--隐式游标的使用
--按照给定的部门编号,删除该部门中的所有雇员信息
declare
v_input_deptno emp.deptno%type;
v_count number:=-1;
begin
v_input_deptno:=&部门编号;
select count(deptno) into v_count from emp
where deptno=v_input_deptno;
if(v_count>0) then
delete from emp where deptno=v_input_deptno;
--利用隐式游标的属性判断删除是否成功
if(sql%found) then
dbms_output.put_line('删除成功。。。');
commit;
else
dbms_output.put_line('删除失败。。。');
rollback;
end if;
else
dbms_output.put_line('该部门不存在。。。');
end if;
end;
--更新游标 通常是为了进行更新操作,更新数据使用的游标
--按照给定的工种,更新雇员的工资,工资上调10%
declare cursor emp_cursor
is
select * from emp where job='&工种' for update of sal;
begin
for i in emp_cursor loop
update emp set sal=i.sal*1.1 where current of emp_cursor;
if(sql%found) then
dbms_output.put_line('更新成功。。。');
else
dbms_output.put_line('更新失败。。。');
end if;
end loop;
commit;
end;
--更新游标的for update 可以锁定游标正在处理的行记录,从而避免由于并发访问
--所带来的数据更新丢失问题。保证并发事务的有效处理