注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

Oracle 开发之 REF CURSOR  

2013-05-28 17:13:07|  分类: Oracle |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

《PL/SQL 语言开发参考手册》下载地址
        前言
        关于 REF_CURSOR 我们已经不再陌生,在前边的博客我们已经接触过了 REF_CURSOR:在博客《怎样让 Oracle 的存储过程返回结果集》中我们在一个返回结果集的 Hello World 级别的存储过程实例中用到了 REF_CURSOR,在博客《烟草局绩效考核系统打分模块开发笔记》中我们在一个真实的项目中体会到 REF_CURSOR 给我们带来的神奇效果。今天,我们将通过学习 Oracle 官方的这篇《Oracle 开发之 REF_CURSOR》进一步解开 REF_CURSOR 的神秘面纱,通过本文的学习,我们对 REF_CURSOR 的理解将会更加深入,而在以后的项目中对它的使用也必将更加规范。
        正文
        Oracle REF_CURSOR 简介
        使用 REF_CURSOR 我们可以从存储过程中得到一个结果集对象。
        REF_CURSOR 分为两种基本类型:强类型 REF_CURSOR 和弱类型 REF_CURSOR,强类型 REF_CURSOR 返回的数据类型和长度在编译期就应该指明,而弱类型 REF_CURSOR 不需要。
        强类型 REF_CURSOR 和 Oracle 9i 之前的弱类型 REF_CURSOR 在包中应该这样定义:

  1. create or replace package REFCURSOR_PKG as  
  2.   TYPE WEAK8i_REF_CURSOR IS REF CURSOR;  
  3.   TYPE STRONG_REF_CURSOR IS REF CURSOR RETURN EMP%ROWTYPE;  
  4. end REFCURSOR_PKG;  
 
        返回 REF_CURSOR 的 PL/SQL 存储过程的编写示例:
  1. /** until Oracle 9 */  
  2. create or replace procedure test( p_deptno IN number  
  3.                                 , p_cursor OUT   
  4. REFCURSOR_PKG.WEAK8i_REF_CURSOR)  
  5. is  
  6. begin  
  7.   open p_cursor FOR   
  8.   select *  
  9.   from   emp  
  10.   where  deptno = p_deptno;  
  11. end test;  
 
        Oracle 9i 之后,我们可以使用 SYS_REFCURSOR 作为 REF_CURSOR 的返回类型,例如:
  1. /** From Oracle 9 */  
  2. create or replace procedure test( p_deptno IN number  
  3.                                 , p_cursor OUT SYS_REFCURSOR)  
  4. is  
  5. begin  
  6.   open p_cursor FOR   
  7.   select *  
  8.   from   emp  
  9.   where  deptno = p_deptno;  
  10. end test;  
  11.   
  12.   
  13. /* Strong type */  
  14.   
  15. create or replace procedure test( p_deptno IN number  
  16.                                 , p_cursor OUT REFCURSOR_PKG.STRONG   
  17. REF_CURSOR)  
  18. is  
  19. begin  
  20.   open p_cursor FOR   
  21.   select *  
  22.   from   emp  
  23.   where  deptno = p_deptno;  
  24. end test;  
 
        JDBC 对 REF_CURSOR 的调用
        我们可以在 JDBC 中使用以下 Java 代码来得到 REF_CURSOR:
  1. public void method() throws SQLException{  
  2.   Connection conn = getConnection();  
  3.   CallableStatement cstmt = null;  
  4.   ResultSet rs = null;  
  5.   int deptno = 10;  
  6.   Object temp;  
  7.   try{  
  8.       cstmt = conn.prepareCall("begin  test(?,?); end;");  
  9.       cstmt.setInt(1, deptno);  
  10.       cstmt.registerOutParameter(2, OracleTypes.CURSOR);   
  11.       cstmt.execute();  
  12.       rs = (ResultSet) cstmt.getObject(2);  
  13.       ResultSetMetaData rsm = rs.getMetaData();  
  14.       int columnCount = rsm.getColumnCount();  
  15.       while (rs.next()){  
  16.          for (int j=0;j< columnCount;j++){  
  17.             temp = rs.getObject(j+1);  
  18.          }  
  19.       }  
  20.   } finally {  
  21.       if (!rs==null){  
  22.         rs.close();  
  23.       }  
  24.       if (!stmt==null){  
  25.         stmt.close();  
  26.       }  
  27.       if (!conn==null){  
  28.         conn.close();  
  29.       }    
  30.   }  
  31. }  
 
        PL/SQL 中对 REF_CURSOR 的调用

  1. create or replace procedure test_call is  
  2.   c_cursor REFCURSOR_PKG.STRONG_REF_CURSOR;  
  3.   r_emp    c_emp%rowtype;  
  4. begin  
  5.   test(10,c_cursor);  
  6.   loop  
  7.     fetch c_cursor into r_emp;  
  8.     exit when c_cursor%notfound;  
  9.     dbms_output.put_line(r_emp.name);  
  10.   end loop;  
  11.   close c_cursor;  
  12. end test_call;  

原文链接:http://www.oradev.com/ref_cursor.jsp
  评论这张
 
阅读(523)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017