2013-03-15 62 views
0

我一直在拉我的頭髮,試圖從返回引用遊標的oracle存儲函數返回結果集。試圖調用一個Oracle存儲函數,將參考光標返回給C#

這裏是由Oracle存儲函數的聲明:

TYPE GetInspectorCursor IS REF CURSOR; 
FUNCTION GetInspectorInformation 
    (inUserID IN inspectortable.userid%type, 
    inPassword IN inspectortable.password%type, 
    inCompanyID IN inspectortable.cid%type, 
    inSubCompanyID in inspectortable.scid%type, 
    outErrorcode OUT NUMBER) 
RETURN GetInspectorCursor; 

這裏是我的C#程序,以獲取結果集:

 String connString = "DATA SOURCE=PEOPLE.WORLD;PASSWORD=password;PERSISTSEC CURITY INFO=True;USER ID=userid"; 


     DataSet ds; 
     OracleDataAdapter myAdapter = null; 
     Oracle.DataAccess.Types.OracleRefCursor refCursor = null; 

     OracleConnection myCon = new OracleConnection(connString); 

     String commandText = "schema.package.GetInspectorInformation"; 

     OracleCommand cmd = new OracleCommand(commandText, myCon); 
     cmd.CommandType = CommandType.StoredProcedure; 


     // inpectorID 
     OracleParameter param = new OracleParameter(); 
     param.OracleDbType = OracleDbType.Char; 
     param.Direction = ParameterDirection.Input; 
     param.Value = "JOHN"; 
     cmd.Parameters.Add(param); 

     // inspector Password 
     OracleParameter param2 = new OracleParameter(); 
     param2.OracleDbType = OracleDbType.Char; 
     param2.Direction = ParameterDirection.Input; 
     param2.Value = "12345"; 
     cmd.Parameters.Add(param2); 

     // VALUE 1 
     OracleParameter param3 = new OracleParameter(); 
     param3.OracleDbType = OracleDbType.Char; 
     param3.Direction = ParameterDirection.Input; 
     param3.Value = "VA1"; 
     cmd.Parameters.Add(param3); 

     // VALUE 2 
     OracleParameter param4 = new OracleParameter(); 
     param4.OracleDbType = OracleDbType.Char; 
     param4.Direction = ParameterDirection.Input; 
     param4.Value = "VA2"; 
     cmd.Parameters.Add(param4); 

     // outParam Error Code 
     OracleParameter param5 = new OracleParameter(); 
     param5.OracleDbType = OracleDbType.Decimal; 
     param5.Direction = ParameterDirection.Output; 
     //param5.IsNullable = true; 
     cmd.Parameters.Add(param5); 


     OracleParameter param6 = new OracleParameter(); 
     param.ParameterName = "RefCursor"; 
     param6.OracleDbType = OracleDbType.Object; 
     param6.OracleDbTypeEx = OracleDbType.RefCursor; 
     param6.Direction = ParameterDirection.ReturnValue; 
     ///param6.IsNullable = false; 
     cmd.Parameters.Add(param6); 


     myCon.Open(); 

     cmd.ExecuteNonQuery(); 


     refCursor = (Oracle.DataAccess.Types.OracleRefCursor)cmd.Parameters["RefCursor"].Value; 
     myAdapter = new OracleDataAdapter("", myCon); 
     ds = new DataSet("testDS"); 
     myAdapter.Fill(ds, refCursor); 

     // Clean up 
     cmd.Dispose(); 
     myCon.Close(); 
     myCon.Dispose(); 

在myCon.Open()調用我得到:

ORA-06550: line 1, column 15: 
PLS-00306: wrong number or types of arguments in call to 'GETINSPECTORINFORMATION' 
ORA-06550: line 1, column 7: 
PL/SQL: Statement ignored 

是否有人會善待一些腦細胞,並告訴我哪些參數正在通過rectly?

謝謝!

回答

0

我不知道如何通過函數返回一個,但你可以通過一個過程返回一個REF CURSOR。試試這個 - 這是之前我曾在許多項目:

首先,改變功能的程序:

PROCEDURE GetInspectorInformation 
    (inUserID IN inspectortable.userid%type, 
    inPassword IN inspectortable.password%type, 
    inCompanyID IN inspectortable.cid%type, 
    inSubCompanyID in inspectortable.scid%type, 
    outErrorcode OUT NUMBER, 
    retCursor getInspectorCursor OUT); 

然後在你的C#代碼,改變了...

param6.Direction = ParameterDirection.ReturnValue; 

...至此...

param6.Direction = ParameterDirection.Output; 

然後填寫數據集,替換所有以開頭的數字有以下幾點:

ds = new DataSet("testDS"); 
new OracleDataAdapter(cmd).Fill(ds); 

如果你有這樣的煩惱,請注意,每當我這樣做我的代碼已經從你貼什麼區別在於:

  • 裁判光標一直OUT參數
  • 裁判光標已通用SYS_REFCURSOR
  • adapter.Fill一直到數據表中的數據集內( new OracleDataAdapter(cmd).Fill(ds.myTableName)

所以你可能還需要試驗一下,但正如我所說,這對我以前的工作。

+0

是的!謝謝!然而,在我的情況下,我需要一個通過調用函數返回的參考光標。 – user2175101 2013-03-17 23:12:03