0

一天多来,我一直在为调用 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 的电子邮件之外,我没有直接访问数据库的权限。

我也承认我在这里可能走错了路。根据我在这里和'net. 任何解决此问题的建议都会有所帮助。

4

1 回答 1

3

对 Oracle 过程的调用需要与被调用过程的参数类型和顺序相匹配。此外,返回值的参数是 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()}'");

}
于 2017-05-03T23:51:39.083 回答