首页 > 解决方案 > .net核心调用oracle函数将返回值放在第一个参数中

问题描述

.net 核心 3.1 nuget:Oracle.ManagedDataAccess.Core 2.19.91

甲骨文功能:

create or replace NONEDITIONABLE FUNCTION        GET_TOTAL_SALES 
(
    PARAM1 IN VARCHAR2,
    PARAM2 IN VARCHAR2 
)
    RETURN VARCHAR2 AS 
BEGIN
    RETURN 'abc';
END GET_TOTAL_SALES;

.net核心代码:

var cmdText = "GET_TOTAL_SALES";
using (var connection = new OracleConnection(connStr))
{
    using (var command = new OracleCommand(cmdText, connection))
    {
        connection.Open();
        command.CommandType = CommandType.StoredProcedure;

        var param1 = new OracleParameter("PARAM1", OracleDbType.Varchar2);
        param1.Direction = ParameterDirection.Input;
        param1.Value = "param1Value";
        command.Parameters.Add(param1);

        var param2 = new OracleParameter("PARAM2", OracleDbType.Varchar2);
        param2.Direction = ParameterDirection.Input;
        param2.Value = "param2Value";
        command.Parameters.Add(param2);

        var returnValue = new OracleParameter("returnValue", OracleDbType.Varchar2);
        returnValue.Direction = ParameterDirection.ReturnValue;
        command.Parameters.Add(returnValue);

        command.ExecuteNonQuery();

        Console.WriteLine(returnValue.Value); //""
        Console.WriteLine(param1.Value); //"abc"
    }
}

结果是返回值被放入第一个参数(param1)而不是returnValue。为什么?帮助!

标签: oracle.net-core

解决方案


我问 Oracle 并得到答复:“这是预期的行为。为函数绑定的第一个参数必须是返回值。来自文档: https ://docs.oracle.com/en/database/oracle/oracle-data -access-components/19.3.2/odpnt/featOraCommand.html

我知道,这很疯狂。我们还可以按名称使用绑定:

command.BindByName = true;

然后顺序无关紧要。


推荐阅读