使用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行"}

使用Oracle.ManagedDataAccess.客户端将函数中的值返回给c#

我从未使用过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,但它起了作用。我有什么理由不使用这个吗?