2016-03-09 102 views
0

任何人都可以提出這個函數調用有什麼問題。沒有返回變量的名稱,不確定是否有任何問題。這在pl sql中正常工作。C#Oracle函數調用


oracle function code: 
    FUNCTION GETSTATUS (
    p_param1   in varchar2, 
    p_param2 in number, 
    p_param3  out varchar2) 
    return boolean 
    is 
    return true; 
    END GETSTATUS; 

ODP.Net版本 - 32位Oraclient10201_win32

C#代碼


var cmd = new OracleCommand("tk_ccc.GETSTATUS ", connweb); 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.BindByName = true; 
cmd.Parameters.Add("Return_Value", OracleDbType.Char, 1, ParameterDirection.Output); 
var prm1 = new OracleParameter("p_param1", OracleDbType.Varchar2, 20, ParameterDirection.Input) { Value = "1649983" }; 
cmd.Parameters.Add(prm1); 
var prm2 = new OracleParameter("p_param2", OracleDbType.Int32, ParameterDirection.Input) { Value = 1 }; 
cmd.Parameters.Add(prm1); 
var prm3 = new OracleParameter("p_param3", OracleDbType.Varchar2, 100, ParameterDirection.Output); 
cmd.Parameters.Add(prm1); 
var ret = cmd.ExecuteNonQuery(); 

錯誤消息:

ORA-06550:第1行,第7列:\ NPLS-00306:錯誤數量或類型的在調用 '的getStatus' \諾拉-06550參數:第1行,第7列:

PL/SQL:語句被忽略

+0

由於最佳實踐功能應只返回一個值,而不是輸出參數和值。 Oracle僅在PL/SQL中具有布爾值。如果你的函數返回一個數字,它可能會工作。 – kevinsky

+0

謝謝。但這是一個共享程序,我不能爲我編輯。 –

+0

爲什麼要添加一個名爲''Return_Value'''的char參數? –

回答

0

SYS.diutil.bool_to_int過程可用於將bool返回值轉換爲整數並使用CommandType.Text,這解決了我的問題。

var cmd = new OracleCommand 
{ 
Connection = connweb, 
CommandText = "begin " + 
":ret_val:= SYS.diutil.bool_to_int(tk_ccc.GETSTATUS(:p_param1,:p_param2,:p_param3)); " + 
" end; ", 
CommandType = CommandType.Text 
}; 
var returnVal = new OracleParameter("ret_val", OracleDbType.Int32,1); 
returnval.Direction=ParameterDirection.ReturnValue; 
cmd.Parameters.Add(returnVal); 
var p_param1 = new OracleParameter("p_param1", OracleDbType.Varchar2, 20); 
p_param1.Direction=ParameterDirection.Input; 
p_param1.Value = "1649983" ; 
cmd.Parameters.Add(p_param1); 
var p_param2 = new OracleParameter("p_param2", OracleDbType.Varchar2, 20); 
p_param2.Direction=ParameterDirection.Input; 
p_param2.Value = "1" ; 
cmd.Parameters.Add(p_param2); 
var p_param3 = new OracleParameter("p_param3", OracleDbType.Varchar2, 200); 
p_param3.Direction=ParameterDirection.Output; 
cmd.Parameters.Add(p_param3); 
var ret = cmd.ExecuteNonQuery(); 
0

我認爲你的返回值參數是問題。它應該使用ParameterDirection.ReturnValue,就像這樣:

cmd.Parameters.Add("Return_Value", OracleDbType.Char, 1, ParameterDirection.ReturnValue); 
+0

cmd.Parameters.Add(「Return_Value」,OracleDbType.Char,1,ParameterDirection.ReturnValue);我得到相同的錯誤信息。 ORA-06550:第1行第15列:\ nPLS-00306:調用'GETSTATUS'時參數的數量或類型錯誤\ nORA-06550:第1行,第7列:\ nPL/SQL: –

0

ODP.NET提供者不支持BOOLEAN數據類型。您必須返回不同的數據類型,例如INTEGER(OracleDbType.Byte)使用0和1.