C# Oracle 函数调用

Posted

技术标签:

【中文标题】C# Oracle 函数调用【英文标题】:C# Oracle Function call 【发布时间】:2016-03-09 19:27:40 【问题描述】:

谁能建议这个函数调用有什么问题。返回变量没有名称,不确定是否有任何问题。这在 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:语句被忽略

【问题讨论】:

作为最佳实践,函数应该返回一个且只有一个值,而不是输出参数和值。 Oracle 仅在 PL/SQL 中具有布尔值。如果您的函数返回一个数字,它可能会起作用。 谢谢。但这是一个共享程序,我不能只为我编辑。 为什么要添加一个名为"Return_Value"的char参数? 有返回值,没有名字。但我只是分配了一个名字。你对此有什么建议吗? 您执行 cmd.Parameters.Add(prm1); 三次。 .Add(prm2) 和 prm3 呢?特别是因为 prm2 是不同的数据类型... 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

即使有这个改变 cmd.Parameters.Add("Return_Value", OracleDbType.Char,1, ParameterDirection.ReturnValue);我收到相同的错误消息。 ORA-06550:第 1 行,第 15 列:\nPLS-00306:调用“GETSTATUS”时参数的数量或类型错误\nORA-06550:第 1 行,第 7 列:\nPL/SQL:语句被忽略 –【参考方案3】:

ODP.NET 提供程序不支持BOOLEAN 数据类型。您必须返回不同的数据类型,例如使用 0 和 1 的整数 (OracleDbType.Byte)。

【讨论】:

以上是关于C# Oracle 函数调用的主要内容,如果未能解决你的问题,请参考以下文章

从c#调用oracle函数给出错误

C# Oracle 函数调用

调用返回游标的 oracle 函数

Oracle 函数调用的返回值返回 null

C#调用替换后Oracle包无效

C#连接MySQL数据库的问题,主界面调用这个函数,结果返回值是-1,请问为啥会抛出异常呢?应该怎么改呢?