1,什么是 REF游标 ?6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
动态关联结果集的临时对象。即在运行的时候动态决定执行查询。6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
2,REF 游标 有什么作用?6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
实现在程序间传递结果集的功能,利用REF CURSOR也可以实现BULK SQL,从而提高SQL性能。
6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
3,静态游标和REF 游标的区别是什么?6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
①静态游标是静态定义,REF 游标是动态关联;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
②使用REF 游标需REF 游标变量。6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
③REF 游标能做为参数进行传递,而静态游标是不可能的。6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
4,什么是REF 游标变量?6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
REF游标变量是一种 引用 REF游标类型  的变量,指向动态关联的结果集。
6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
5,怎么使用  REF游标 ?6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
①声明REF 游标类型,确定REF 游标类型;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  ⑴强类型REF游标:指定retrun type,REF 游标变量的类型必须和return type一致。6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  语法:Type  REF游标名  IS  Ref Cursor Return  结果集返回记录类型;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  ⑵弱类型REF游标:不指定return type,能和任何类型的CURSOR变量匹配,用于获取任何结果集。6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  语法:Type  REF游标名  IS  Ref Cursor;
6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
②声明Ref 游标类型变量;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  语法:变量名  已声明Ref 游标类型;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
③打开REF游标,关联结果集 ;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  语法:Open  Ref 游标类型变量  For  查询语句返回结果集;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
④获取记录,操作记录;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  语法:Fatch    REF游标名 InTo  临时记录类型变量或属性类型变量列表;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
⑤关闭游标,完全释放资源;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  语法:Close  REF游标名;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
例子:强类型REF游标6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
/*conn scott/tiger*/6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
Declare 6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  Type MyRefCurA IS  REF CURSOR RETURN emp%RowType;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  Type MyRefCurB IS  REF CURSOR RETURN emp.ename%Type;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  vRefCurA  MyRefCurA;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  vRefCurB  MyRefCurB;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  vTempA  vRefCurA%RowType;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  vTempB  vRefCurB.ename%Type;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
Begin6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  Open  vRefCurA  For Select  *  from  emp  Where  SAL > 2000;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  Loop6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  Fatch  vRefCurA InTo  vTempA;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  Exit  When  vRefCurA%NotFound;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  DBMS_OUTPUT.PUT_LINE(vRefCurA%RowCount||'  '|| vTempA.eno||'  '||vTempA.ename ||'  '||vTempA.sal)6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  End Loop;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  Close vRefCurA;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------------------------------------------');6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  Open  vRefCurB  For Select  ename  from  emp  Where  SAL > 2000;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  Loop6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  Fatch  vRefCurB InTo  vTempB;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  Exit  When  vRefCurB%NotFound;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  DBMS_OUTPUT.PUT_LINE(vRefCurB%RowCount||'  '||vTempB)6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  End Loop;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  Close vRefCurB; 6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------------------------------------------');  6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  Open  vRefCurA  For Select  *  from  emp  Where  JOB = 'CLERK';6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  Loop6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  Fatch  vRefCurA InTo  vTempA;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  Exit  When  vRefCurA%NotFound;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  DBMS_OUTPUT.PUT_LINE(vRefCurA%RowCount||'  '|| vTempA.eno||'  '||vTempA.ename ||'  '||vTempA.sal)6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  End Loop;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  Close vRefCurA;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
End;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
例子:弱类型REF游标6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
/*conn scott/tiger*/6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
Declare6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  Type MyRefCur  IS  Ref  Cursor;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  vRefCur MyRefCur;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  vtemp  vRefCur%RowType;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
Begin6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  Case(&n)6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  When  1 Then Open vRefCur  For Select  *  from emp;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  When  2 Then Open vRefCur  For Select  *  from dept;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  Else 6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
    Open vRefCur  For Select  eno,  ename  from emp Where JOB = 'CLERK';6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  End Case;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
  Close  vRefCur;6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë
End;
6Ž¿+WBUE²_www.netcsharp.cn/“EN5^ë