zoukankan      html  css  js  c++  java
  • [转]Oracle 调用存储过程并显示结果集 Oracle.DataAccess.Client OracleDbType.RefCursor

    本文转自:http://liye9801.blog.163.com/blog/static/6019703200901244448950/

    今天学习了一个Oracle中的存储过程,一开始便被如果返回结果集难住了.经Google后,找到很多资料,发现一种最简便的方式(见下面的存储过程部分):
    
    存储过程建好后,怎么调试它又成了问题,它不能像MS-SqlServer一样exec,但是可以通过下面的SQL语句调用(见调用存储过程SQL版),主要知识点是
    
    参考游标的使用.
    
    后面附上.NET调用存储过程返回结果集的方法.
    
    JAVA调用的方法还没有进行测试,不过应该没什么问题.
    
     
    
     
    
    --存储过程返回结果集
    
    create or replace procedure getResult(p_cur out sys_refcursor) 
    as 
    begin 
    open p_cur for 
    select * from T_MyAccount; --你的sql 语句 
    
    end getResult;
    
     
    
    --SQL调用存储过程
    
    DECLARE TYPE mytable IS TABLE OF t_myAccount%ROWTYPE; 
    l_data mytable; 
    l_refc sys_refcursor; 
    BEGIN 
    
    --调用存储过程
    
    getresult(l_refc); 
    
    FETCH l_refc BULK COLLECT INTO l_data;
    
    
    CLOSE l_refc;
    
    FOR i IN 1 .. l_data.COUNT 
    LOOP 
         DBMS_OUTPUT.put_line (l_data (i).fAccount || l_data (i).fPassword); 
    END LOOP; 
    END;
    
     
    
    --.NET调用存储过程
    
    ''' <summary> 
    ''' .NET 调用存储过程并返回结果集  VB.NET版
    
    ''' 要注意的一个重点是orc.Parameters.Add("Rec", OracleDbType.RefCursor, ParameterDirection.Output) 
    ''' </summary> 
    ''' <remarks></remarks> 
    Private Sub ExecOracleProc() 
        Dim constr As String = "Data Source=192.168.0.209:1521/XE;Persist Security Info=True;User ID=LSH;password=" 
        Dim con As New Oracle.DataAccess.Client.OracleConnection(constr) 
        Dim orc As New OracleCommand() 
        Dim oda As New OracleDataAdapter(orc) 
        con.Open() 
        orc.Connection = con 
        orc.CommandText = "getResult" 
        orc.Parameters.Add("Rec", OracleDbType.RefCursor, ParameterDirection.Output) 
        orc.CommandType = CommandType.StoredProcedure 
        'd.ExecuteNonQuery() 
        Dim ds As New DataSet 
        oda.Fill(ds) 
        Me.DataGridView2.DataSource = ds.Tables(0) 
        con.Close() 
    
    End Sub
    
     
    
    Java中调用存储过程:
    
    import java.sql.*; 
    import oracle.jdbc.*;
    
    public class TestResultSet { 
    public TestResultSet() { 
    try { 
    DriverManager.registerDriver (new oracle.jdbc.OracleDriver()); 
    Connection conn = DriverManager.getConnection(”jdbc:oracle:oci:@w2k1″, “scott”, “tiger”); 
    CallableStatement stmt = conn.prepareCall(”BEGIN GetEmpRS(?, ?); END;”); 
    stmt.setInt(1, 30); // DEPTNO 
    stmt.registerOutParameter(2, OracleTypes.CURSOR); //REF CURSOR 
    stmt.execute(); 
    ResultSet rs = ((OracleCallableStatement)stmt).getCursor(2); 
    while (rs.next()) { 
    System.out.println(rs.getString(”ename”) + “:” + rs.getString(”empno”) + “:” + rs.getString(”deptno”)); 
    } 
    rs.close(); 
    rs = null; 
    stmt.close(); 
    stmt = null; 
    conn.close(); 
    conn = null; 
    } 
    catch (SQLException e) { 
    System.out.println(e.getLocalizedMessage()); 
    } 
    }
    
    public static void main (String[] args) { 
    new TestResultSet(); 
    } 
    }
  • 相关阅读:
    【转】如何高效地阅读技术类书籍与博客
    测试站点大全
    【转】软件测试面试- 购物车功能测试用例设计
    div+css 定位浅析
    C# Enum,Int,String的互相转换
    sqlserver 空间数据类型
    系统学习sqlserver2012 一
    sql查询数据库中所有表的记录条数,以及占用磁盘空间大小。
    linux网站推荐
    匿名用户访问sharepoint2010中的列表
  • 原文地址:https://www.cnblogs.com/freeliver54/p/3152913.html
Copyright © 2011-2022 走看看