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 函数调用的主要内容,如果未能解决你的问题,请参考以下文章