如何解决这个 "PLS-00306: wrong number or types of arguments in call..."

How to resolve this "PLS-00306: wrong number or types of arguments in call..."

一天多来,我一直在努力调用 Oracle 数据库。除了编程方式,我无法访问数据库,尽管 DBA 能够提供以下信息:

desc appowner.member_data_package

PROCEDURE UPDATE_NOTES_V001
Argument Name                  Type                    In/Out Default?
------------------------------ ----------------------- ------ --------
TAU_UID_IN                     VARCHAR2                IN
INCOMING_FUNC_IN               VARCHAR2                IN
INCOMING_TEXT_IN               VARCHAR2                IN
SYS_SOURCE_IN                  VARCHAR2                IN
USER_ID_IN                     VARCHAR2                IN
O_STATUS                       VARCHAR2                OUT

我的代码如下所示:

using (var connection = new OracleConnection(connectionString))
{
    connection.Open();

    OracleCommand command = new OracleCommand
    {
        Connection = connection,
        CommandType = CommandType.StoredProcedure,
        CommandText = "appowner.MEMBER_DATA_PACKAGE.UPDATE_NOTES_V001",
        BindByName = true
    };

    command.Parameters.Add(new OracleParameter("O_STATUS", OracleDbType.Varchar2, ParameterDirection.ReturnValue));
    command.Parameters.Add(new OracleParameter("TAU_UID_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "7400";
    command.Parameters.Add(new OracleParameter("INCOMING_FUNC_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "PROVCOUNT";
    command.Parameters.Add(new OracleParameter("INCOMING_TEXT_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "Pypestream testing.";
    command.Parameters.Add(new OracleParameter("SYS_SOURCE_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "CRM";
    command.Parameters.Add(new OracleParameter("USER_ID_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "jac";

    command.ExecuteNonQuery();
    Console.WriteLine($"Insert output value is '{command.Parameters["O_STATUS"].Value.ToString()}'");

}

我在 运行 时得到的错误是:

ORA-06550: line 1, column 15:
PLS-00306: wrong number or types of arguments in call to 'UPDATE_NOTES_V001'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

据我所知,我 拥有正确数量和类型的参数,但如果有人在 Oracle 方面比我更聪明(基本上,任何人) 可以指出我搞砸的地方那太棒了。

如果该部分看起来正确并且错误是某种红色鲱鱼,我还能看什么?还有其他方法可以调用此过程吗?请记住,除了 Visual Studio 2017 之外,我没有其他工具。我无法下载任何有用的扩展。除了向 DBA 发送电子邮件外,我无法直接访问数据库。

我也承认我在这里可能完全错了方向。根据我在此处和“网络”周围看到的一些示例,我完全猜测将值插入 Oracle 数据库的代码看起来像这样。任何解决此问题的建议都会有所帮助。

对Oracle过程的调用需要匹配被调用过程参数的类型和顺序。另外,returns一个值的参数是一个OutPut参数。您的代码与被调用过程的参数不匹配,因此出现错误。将其更改为:

using (var connection = new OracleConnection(connectionString))
{
connection.Open();

OracleCommand command = new OracleCommand
{
    Connection = connection,
    CommandType = CommandType.StoredProcedure,
    CommandText = "appowner.MEMBER_DATA_PACKAGE.UPDATE_NOTES_V001",
    BindByName = true
};

command.Parameters.Add(new OracleParameter("TAU_UID_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "7400";
command.Parameters.Add(new OracleParameter("INCOMING_FUNC_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "PROVCOUNT";
command.Parameters.Add(new OracleParameter("INCOMING_TEXT_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "Pypestream testing.";
command.Parameters.Add(new OracleParameter("SYS_SOURCE_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "CRM";
command.Parameters.Add(new OracleParameter("USER_ID_IN", OracleDbType.Varchar2, ParameterDirection.Input)).Value = "jac";
command.Parameters.Add(new OracleParameter("O_STATUS", OracleDbType.Varchar2, ParameterDirection.OutPut));

command.ExecuteNonQuery();
Console.WriteLine($"Insert output value is '{command.Parameters["O_STATUS"].Value.ToString()}'");

}