游标

oracle ldboyghg 43℃ 0评论
–For 循环游标
–(1)定义游标
–(2)定义游标变量
–(3)使用for循环来使用这个游标
declare
–类型定义
cursor c_job
is
select empno,ename,job,sal
from emp
where job=’MANAGER';
–定义一个游标变量v_cinfo c_emp%ROWTYPE ,该类型为游标c_emp中的一行数据类型
c_row c_job%rowtype;
begin
for c_row in c_job loop
dbms_output.put_line(c_row.empno||’-‘||c_row.ename||’-‘||c_row.job||’-‘||c_row.sal);
end loop;
end;
–Fetch游标
–使用的时候必须要明确的打开和关闭
declare
–类型定义
cursor c_job
is
select empno,ename,job,sal
from emp
where job=’MANAGER';
–定义一个游标变量
c_row c_job%rowtype;
begin
open c_job;
loop
–提取一行数据到c_row
fetch c_job into c_row;
–判读是否提取到值,没取到值就退出
–取到值c_job%notfound 是false
–取不到值c_job%notfound 是true
exit when c_job%notfound;
dbms_output.put_line(c_row.empno||’-‘||c_row.ename||’-‘||c_row.job||’-‘||c_row.sal);
end loop;
–关闭游标
close c_job;
end;
– 引用游标:
 Declare
  Type MyRefCurA IS  REF CURSOR RETURN emp%RowType;
  Type MyRefCurB IS  REF CURSOR RETURN emp.ename%Type;
  vRefCurA  MyRefCurA;
  vRefCurB  MyRefCurB;
  vTempA  vRefCurA%RowType;
  vTempB  vRefCurB.ename%Type;
 Begin
  Open  vRefCurA  For Select  *  from   emp   Where  SAL > 2000;
  Loop
   Fatch  vRefCurA InTo  vTempA;
   Exit  When  vRefCurA%NotFound;
   DBMS_OUTPUT.PUT_LINE(vRefCurA%RowCount||’  ‘|| vTempA.eno||’ ‘||vTempA.ename ||’  ‘||vTempA.sal)
  End Loop;
  Close vRefCurA;
  DBMS_OUTPUT.PUT_LINE(‘——————————————————————————————————-‘);
  Open  vRefCurB  For Select  ename  from   emp   Where  SAL > 2000;
  Loop
   Fatch  vRefCurB InTo  vTempB;
   Exit  When  vRefCurB%NotFound;
   DBMS_OUTPUT.PUT_LINE(vRefCurB%RowCount||’  ‘||vTempB)
  End Loop;
  Close vRefCurB;
  DBMS_OUTPUT.PUT_LINE(‘——————————————————————————————————-‘);
  Open  vRefCurA  For Select  *  from   emp   Where  JOB = ‘CLERK';
  Loop
   Fatch  vRefCurA InTo  vTempA;
   Exit  When  vRefCurA%NotFound;
   DBMS_OUTPUT.PUT_LINE(vRefCurA%RowCount||’  ‘|| vTempA.eno||’ ‘||vTempA.ename ||’  ‘||vTempA.sal)
  End Loop;
  Close vRefCurA;
 End;
 例子:弱类型REF游标
 Declare
  Type MyRefCur  IS  Ref  Cursor;
  vRefCur MyRefCur;
  vtemp  vRefCur%RowType;
 Begin
  Case(&n)
   When  1 Then Open vRefCur  For Select   *   from emp;
   When  2 Then Open vRefCur  For Select   *   from dept;
   Else
    Open vRefCur  For Select   eno,  ename  from emp Where JOB = ‘CLERK';
  End Case;
  Close  vRefCur;
 End;
6,怎样让REF游标作为参数传递?
这个是经过修改的,可以运行的程序:
Declare
  Type MyRefCurA IS  REF CURSOR ;
  vRefCurA  MyRefCurA;
  vRefCurB  MyRefCurA;
  vTempA  emp%RowType;
  vTempB  emp.ename%Type;
 Begin
  Open  vRefCurA  For Select  *  from  emp   Where  SAL > 2000;
  Loop
   Fetch  vRefCurA InTo  vTempA;
   Exit  When  vRefCurA%NotFound;
   DBMS_OUTPUT.PUT_LINE(vRefCurA%RowCount||’  ‘|| vTempA.empno||’  ‘||vTempA.ename ||’  ‘||vTempA.sal);
  End Loop;
  Close vRefCurA;
  DBMS_OUTPUT.PUT_LINE(‘————————————–‘);
  Open  vRefCurB  For Select  ename  from   emp   Where  SAL > 2000;
  Loop
   Fetch  vRefCurB InTo  vTempB;
   Exit  When  vRefCurB%NotFound;
   DBMS_OUTPUT.PUT_LINE(vRefCurB%RowCount||’  ‘||vTempB);
  End Loop;
  Close vRefCurB;
  DBMS_OUTPUT.PUT_LINE(‘—————————————‘);
  Open  vRefCurA  For Select  *  from   emp   Where  JOB = ‘CLERK';
  Loop
   Fetch  vRefCurA InTo  vTempA;
   Exit  When  vRefCurA%NotFound;
   DBMS_OUTPUT.PUT_LINE(vRefCurA%RowCount||’  ‘|| vTempA.empno||’  ‘||vTempA.ename ||’  ‘||vTempA.sal);
  End Loop;
  Close vRefCurA;
 End;

转载请注明:生命不息,奋斗不止 » 游标

喜欢 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址