1. 程式人生 > >Oracle用儲存過程查詢多張表的方法

Oracle用儲存過程查詢多張表的方法

前用企業庫讀SQL Server返回資料集沒任何問題,可以返回1個也可以返回多個,讀Oracle的時候返回一個數據集的時候也沒問題,可是最近在用Oracle返回多個數據集的時候卻出了問題,幾經輾轉,終於找到了解決方案,記下來!一定要記下來!千萬不可忘記!!!!!!! 以下程式碼在vss2005+oracle10g下測試通過。要使用企業庫,肯定先引用嘍: cs檔案新增三個引用: Code
using Microsoft.Practices.EnterpriseLibrary.Data;
using Microsoft.Practices.EnterpriseLibrary.Common;
using Microsoft.Practices.ObjectBuilder;
1)返回一個結果集的方法: Oracle儲存過程: PL/SQL
create or replace procedure P_Sel_TopCount(in_top    in number,
                                           out_count out number,
                                           cur_out out sys_refcursor) is
  --查詢指定記錄條數的資料,並返回總共記錄數
begin
  SELECT COUNT(*) into out_count FROM userinfo;     open cur_out for
    SELECT * FROM userinfo where id < in_top;
end P_Sel_TopCount; 注意:過程中的遊標cur_out,傳說是企業庫在呼叫Oracle的時候返回一個結果集的時候就認識這一個名字cur_out,如果改成別的就不行了(我試過,改成別的名後確實出錯,企業庫就不認識了),具體為什麼,我也不知道了。 c#的呼叫: //建立資料庫物件
Database db = DatabaseFactory.CreateDatabase("Oracle");
//構造cmd
DbCommand dbcmd = db.GetStoredProcCommand("P_Sel_TopCount");
            //新增引數,並且不用設定過程中的遊標引數,企業庫會去自動找那個名為”cur_out“的遊標,並且只認識那一個名為”cur_out“的遊標引數
            db.AddInParameter(dbcmd, "in_top", DbType.Int32, 10);  //輸入引數
            db.AddOutParameter(dbcmd, "out_count", DbType.Int32, 4);  //輸出引數
           //獲取資料,這裡在ds中只有一個DataTable
            DataSet ds=db.ExecuteDataSet(dbcmd);
            this.dataGridView1.DataSource = ds.Tables[0];
  以上是返回一個數據集的,下面再看看如何返回多個數據集,這裡只給出返回2個數據集的程式碼,當然也可以新增多個。 (2)返回多個結果集的方法: Oracle儲存過程: create or replace procedure P_Sel_TopCount2(in_top    in number,
                                           out_count out number,
                                           cur_out_1 out sys_refcursor,
                                           cur_out_2 out sys_refcursor) is
  --查詢指定記錄條數的資料,並返回總共記錄數,返回多個數據集
begin
  SELECT COUNT(*) into out_count FROM userinfo;
  open cur_out_1 for
    SELECT * FROM userinfo where id < in_top;
  open cur_out_2 for
    SELECT * FROM userinfo where id < 5;
end P_Sel_TopCount2;
  c#呼叫: //構造資料庫
Database db = DatabaseFactory.CreateDatabase("Oracle");
//構造cmd
DbCommand dbcmd = db.GetStoredProcCommand("P_Sel_TopCount2");
            //新增引數
            db.AddInParameter(dbcmd, "in_top", DbType.Int32, 10);
            db.AddOutParameter(dbcmd, "out_count", DbType.Int32, 4);
            //注意:這裡是關鍵,必須明確新增兩個Oracle的遊標引數,並且指明為OutPut,然後加進cmd命令物件裡
            OracleParameter oraPara1 = new OracleParameter("cur_out_1", OracleType.Cursor);
            OracleParameter oraPara2 = new OracleParameter("cur_out_2", OracleType.Cursor);            //指明為輸出引數
            oraPara1.Direction = ParameterDirection.Output;
            oraPara2.Direction = ParameterDirection.Output;             //新增引數到cmd
            dbcmd.Parameters.Add(oraPara1);
            dbcmd.Parameters.Add(oraPara2);
            //獲取資料,這時候在ds中就有兩個DataTable了。
            DataSet ds=db.ExecuteDataSet(dbcmd);
            this.dataGridView1.DataSource = ds.Tables[1];

總結:如果要返回多個結果皆,必須新增OracleParameter型別的引數。

轉載自:http://blog.csdn.net/lploveme/article/details/5986005