• [转]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(); 
    } 
    }
  • 相关阅读:
    【BZOJ4568】幸运数字(SCOI2016)-树上倍增+异或线性基合并
    【BZOJ2115】XOR(WC2011)-异或线性基+DFS树+贪心
    【HDU3949】XOR-异或线性基
    【BZOJ3105】新Nim游戏(CQOI2013)-博弈论+异或线性基+贪心
    购物单 && 动态规划 && 背包问题
    求int型正整数在内存中存储时1的个数 && int型的数到底最大是多少?
    Eqaulize Prices
    Nearest Interesting Number
    英文句子的逆序
    字符串反转
  • 原文地址:https://www.cnblogs.com/freeliver54/p/3152913.html
Copyright © 2020-2023  润新知