2016-03-09 61 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.