oracle--游标--bai

--复制表
create table emp as(select * from scott.emp);
select * from emp;
--(1) 最简单的游标
declare --声明并初始化游标 
cursor v_cur is
select empno,ename from emp order by empno;
v_empno emp.empno%type;
v_ename emp.ename%type;
begin
if(not v_cur%isopen) then  --打开游标
open v_cur;
end if;
loop  --提取记录
fetch v_cur into v_empno,v_ename;
if(v_cur%notfound) then --到达末尾,则退出循环
exit;
end if;
dbms_output.put_line('第'||v_cur%rowcount||'条记录:'||v_empno||','||v_ename);
end loop;
close v_cur; --关闭游标
end;
--(2) 带参数的游标
  --查找指定部门的所有员工
cursor v_cur(v_deptno number) is
select empno,ename from scott.emp where deptno = v_deptno order by empno ;
v_empno scott.emp.empno%type;
v_ename scott.emp.ename%type;
v_dno scott.emp.deptno%type;  
begin
v_dno:='&请输入部门编号:';
if(not v_cur%isopen) then
open v_cur(v_dno);
end if;
dbms_output.put_line('部门号'||v_dno||'的员工如下:');
loop
fetch v_cur into v_empno,v_ename;
if(v_cur%notfound) then  --到达末尾,则退出循环
exit ;
end if;
dbms_output.put_line('第'||v_cur%rowcount||'条记录:'||v_empno||','||v_ename);  
end loop;
 --关闭游标
  close v_cur;
  exception
  when others then
  dbms_output.put_line('提取出错');
end;

--(3) 可写游标。让每每个员工工资增加1000元
declare
  --声明并初始化游标
  cursor v_cur is
  select 1 from scott.emp order by empno 
  for update of sal nowait ;
  --v_sal scott.emp.sal%type;
  i number;
begin
  --打开游标
  if(not v_cur%isopen) then
   open v_cur;
   end if;
  --提取记录
  loop    
    fetch v_cur into i;
     if(v_cur%notfound) then  --到达末尾,则退出循环
      exit ;
     end if;
     --update scott.emp set sal = sal+10000 where empno = v_empno;
     update scott.emp set sal = sal+10000 where current of v_cur;
  end loop;
    dbms_output.put_line('成功修改了'||v_cur%rowcount||'人的工资');
  --关闭游标
  close v_cur;
end;

--(4)  简化方式1
declare
  --声明并初始化游标
  cursor v_cur is
  select empno,ename from scott.emp order by empno;
begin
  --提取记录
  for rec in v_cur loop
    dbms_output.put_line('第'||v_cur%rowcount||'条记录:'||rec.empno
    ||','||rec.ename);  
  end loop;  
  
end;


--(5)  简化方式2
declare
  --声明并初始化游标
begin
  --提取记录
  for rec in (select empno,ename from scott.emp order by empno) 
  loop
    dbms_output.put_line(rec.empno
    ||','||rec.ename);  
  end loop;  
  
end;


--(6) 返回游标的函数
 --返回周三入职的员工
  select * from scott.emp where to_char(hiredate,'day')='星期五';
 
create or replace function get_emps_hired_oneday
 (
    v_day varchar2
 )return sys_refcursor
 as
  v_cur sys_refcursor;--声明1个局部变量游标,用于返回
 begin
   --打开指定结果集的游标.
   open v_cur for
     select ename,hiredate from scott.emp
     where to_char(hiredate,'day')=v_day;
   return v_cur; --将该记录集的游标返回
 end;
 
 
 
 --调用函数,浏览全部的记录。
 
 declare
  v_cur sys_refcursor;
  v_ename varchar2(20);
  v_hiredate date;
 begin
 
  --调用别人写好函数。
  v_cur:= get_emps_hired_oneday('星期五');
    
    --提取记录
  loop    
    fetch v_cur into v_ename,v_hiredate;
     if(v_cur%notfound) then  --到达末尾,则退出循环
      exit ;
     end if;
    dbms_output.put_line('第'||v_cur%rowcount||'条记录:'||v_ename||','
    ||to_char(v_hiredate,'yyyy-mm-dd day'));  
  end loop;  
  --关闭游标
  close v_cur;
  
 end;

  

posted @ 2017-01-06 19:52  ATJAVA  阅读(106)  评论(0编辑  收藏  举报