• Oracle 开发之 REF_CURSOR


    《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

  • 相关阅读:
    C#的日期格式化输出
    c#使用wmi
    dll注入
    VBScript函数
    时间间隔取法
    抗衰老药物中国传统的食品
    Net资源泄露
    c# 内存共享、内存映射文件
    使用VS2005的 ClickOnce 技术实现按需下载组件
    .NET验证码页出错
  • 原文地址:https://www.cnblogs.com/wbzhao/p/2421109.html
Copyright © 2020-2023  润新知