C#Oracle函数调用

时间:2016-03-09 19:27:40

标签: c# oracle

有人可以说明这个函数调用有什么问题。返回变量没有名称,不确定是否存在任何问题。这在pl sql中正常工作。

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'\ nORA-06550:第1行第7列的参数数目错误:

     

PL / SQL:忽略语句

3 个答案:

答案 0 :(得分:2)

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();

答案 1 :(得分:0)

我认为您的返回值参数是问题所在。它应该使用ParameterDirection.ReturnValue,如下所示:

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

答案 2 :(得分:0)

ODP.NET提供程序不支持-Dspark.master=local[*]数据类型。您必须返回不同的数据类型,例如INTEGER(BOOLEAN)使用0和1。