使用Oracle.ManagedDataAccess.客户端将函数中的值返回给c#
本文关键字:返回 函数 Oracle ManagedDataAccess 客户端 使用 | 更新日期: 2023-09-27 17:58:36
我在Oracle中有以下函数:
FUNCTION return_test (p_id varchar2) RETURN VARCHAR2
is
p_return_val VARCHAR2 (500 CHAR) := 'test';
begin
return p_return_val;
end;
我正试图将该值输入到我的c#代码中,如下所示:
var dbCommand = new OracleCommand();
string retVal;
string Function_query = "PKG_TEST.return_test";
dbConnection = new OracleConnection(ConnString);
dbConnection.Open();
OracleParameterCollection dbParams = dbCommand.Parameters;
dbParams.Add("p_return_val", OracleDbType.Varchar2, System.Data.ParameterDirection.ReturnValue);
dbParams.Add("p_id", OracleDbType.Varchar2, "123", System.Data.ParameterDirection.Input);
OracleCommand cmd;
OracleParameter dbAddParam;
cmd = new OracleCommand(Function_query , dbConnection);
cmd.CommandType = CommandType.StoredProcedure;
foreach (OracleParameter dbParam in dbParams)
{
dbAddParam = (OracleParameter)dbParam.Clone(); // clones all settings
cmd.Parameters.Add(dbAddParam);
}
retVal = cmd.ExecuteScalar().tostring();
调试时的错误为:
{"ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小''nRA-06512:在第1行"}
我从未使用过OracleParameterCollection
。通常我把Parameters
一个接一个地加到OracleCommand
上。
无论如何,试试这个:
OracleParameterCollection dbParams = dbCommand.Parameters;
dbParams.Add("p_return_val", OracleDbType.Varchar2, 500, null, ParameterDirection.ReturnValue);
dbParams.Parameters["p_return_val"].DbType = DbType.String; // Maybe this line is not required at Oracle.ManagedDataAccess. However, you must use it for Oracle.DataAccess
dbParams.Add("p_id", OracleDbType.Varchar2, "123", ParameterDirection.Input);
string Function_query = "BEGIN :p_return_val := PKG_TEST.return_test(:p_id); END;";
cmd = new OracleCommand(Function_query , dbConnection);
cmd.CommandType = CommandType.Text
cmd.Parameters.Add(dbParams);
cmd.ExecuteNonQuery();
retval = cmd.Parameters["p_return_val"].Value;
不能在函数调用中使用方法ExecuteScalar()
,它仅用于结果集,即SELECT ...
语句。请参阅数据提供程序。NET开发人员指南
感谢您的贡献。我现在就试试。与此同时,我们发现这是可行的:
string query = "select PKG_TEST.return_test(:x) from dual";
dbParams.Add("x", OracleDbType.Varchar2, QuoteID, System.Data.ParameterDirection.Input);
var result = (string)dbManager.ExecuteScalar(query, dbParams, CommandType.Text);
对我来说,它看起来像是我一直试图避免的内联SQL,但它起了作用。我有什么理由不使用这个吗?