欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

游标简单操作

程序员文章站 2022-07-10 15:10:27
...

 

 

--显示游标 处理检索多行数据

--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 可以锁定游标正在处理的行记录,从而避免由于并发访问
--所带来的数据更新丢失问题。保证并发事务的有效处理