本文轉自: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(); } }
