0

我从 C# 调用我的存储过程,我得到以下异常:

ORA-06550:第 1 行,第 7 列:
PLS-00306:调用“MY_PROC”时参数的数量或类型错误
ORA-06550:第 1 行,第 7 列:
PLS-00306:调用“的参数数量或类型错误” MY_PROC'
ORA-06550:第 1 行,第 7 列:
PL/SQL:语句被忽略

由于我的程序有 57 个参数,因此很难知道真正的问题出在哪里。有没有办法得到更详细的消息?

注意:但是参数类型和数量似乎匹配!

这是我的存储过程参数:

Var_PE_...  IN  NUMBER(8,0),
Var_PE_...  IN  NUMBER(4,0),
Var_PE_...  IN  NUMBER(3,0),
Var_PE_...  IN  DATE,
Var_PE_...  IN  DATE,
Var_PE_...  IN  NUMBER(2,0),
Var_PE_...  IN  NUMBER(4,0),
Var_PE_...  IN  NUMBER(4,0),
Var_PE_...  IN  NUMBER(8,0),
Var_PE_...  IN  NUMBER(7,0),
Var_PE_...  IN  VARCHAR2(1 BYTE),
Var_PE_...  IN  CHAR(1 BYTE),
Var_PE_...  IN  NUMBER(15,0),
Var_PE_...  IN  VARCHAR2(25 BYTE),
Var_PE_...  IN  VARCHAR2(25 BYTE)
Var_PE_...  IN  VARCHAR2(25 BYTE),
Var_PE_...  IN  VARCHAR2(25 BYTE),
Var_PE_...  IN  NUMBER(5,0),
Var_PE_...  IN  VARCHAR2(25 BYTE),
Var_PE_...  IN  VARCHAR2(25 BYTE),
Var_PE_...  IN  NUMBER(5,0),
Var_PE_...  IN  NUMBER(5,0),
Var_PE_...  IN  VARCHAR2(11 BYTE),
Var_PE_...  IN  NUMBER(2,0),
Var_PE_...  IN  CHAR(2 BYTE),
Var_PE_...  IN  VARCHAR2(17 BYTE),
Var_PE_...  IN  DATE,
Var_PE_...  IN  DATE,
Var_PE_...  IN  DATE,
Var_PE_...  IN  NUMBER(12,5),
Var_PE_...  IN  NUMBER(9,2),
Var_PE_...  IN  NUMBER(3,0),
Var_PE_...  IN  NUMBER(9,2),
Var_PE_...  IN  CHAR(2 BYTE),
Var_PE_...  IN  CHAR(3 BYTE),
Var_PE_...  IN  NUMBER(3,0),
Var_PE_...  IN  NUMBER(7,2),
Var_PE_...  IN  NUMBER(3,0),
Var_PE_...  IN  NUMBER(9,2), 
Var_PE_...  IN  NUMBER(9,2),
Var_PE_...  IN  NUMBER(10,0),
Var_PE_...  IN  VARCHAR2(49 BYTE),
Var_PE_...  IN  CHAR(1 BYTE),
Var_PE_...  IN  CHAR(1 BYTE),
Var_PE_...  IN  CHAR(6 BYTE),
Var_PE_...  IN  CHAR(1 BYTE),
Var_PE_...  IN  NUMBER(9,2),
Var_PE_...  IN  VARCHAR2(13 BYTE),
Var_PE_...  IN  NUMBER(2,0),
Var_PE_...  IN  VARCHAR2(2 BYTE),
Var_PE_...  IN  DATE,
Var_PE_...  IN  DATE,
Var_PE_...  IN  VARCHAR2(1 BYTE),
Var_PE_...  IN  NUMBER(2,0),
Var_PE_...  IN  VARCHAR2(20 BYTE),

Var_PS...   OUT VARCHAR2,
Var_PS...   OUT VARCHAR2

这是我从 c# 调用此过程的方法:

l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Date,       0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Date,       0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Date,       0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Date,       0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Date,       0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Double,     0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Double,     0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Double,     0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Double,     0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Double,     0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Double,     0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Double,     0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Double,     0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Date,       0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Date,       0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32,      0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));

l_Params.Add(CreateOutputDbParameter(DbType.AnsiString, 2000, "PS_..."));
l_Params.Add(CreateOutputDbParameter(DbType.AnsiString, 2000, "PS_..."));

ExecuteStoreProcedure("MY_PROC", l_Params);

用于创建参数的主页代码:

    public DbParameter CreateInputDbParameter(DbType typeParam, int sizeparam,
        string nameParam, object valueParam)
    {
        DbParameter DbParam = Parameter;
        DbParam.DbType = typeParam;
        DbParam.Size = sizeparam;
        DbParam.Direction = ParameterDirection.Input;
        DbParam.ParameterName = nameParam;
        if (valueParam == null)
        {
            DbParam.Value = DBNull.Value;
        }
        else
        {
            DbParam.Value = valueParam;
        }
        return DbParam;
    }

    public DbParameter CreateOutputDbParameter(DbType typeParam, int sizeparam, string nameParam)
    {
        DbParameter DbParam = Parameter;
        DbParam.DbType = typeParam;
        DbParam.Size = sizeparam;
        DbParam.Direction = ParameterDirection.Output;
        DbParam.ParameterName = nameParam;
        return DbParam;
    }
4

1 回答 1

0

如果是输出,则需要将参数方向设置为 ParameterDirection.Output

OracleParameter test= 
    new OracleParameter("testparameter", OracleDbType.Varchar2);
test.Direction = ParameterDirection.Output;
cmd.Parameters.Add(test);

如果是输入,则将其设置为 ParameterDirection.Input

检查参数的大小,声明时没有给出大小。而且参数的类型也很重要。例如,您已NUMBER(15,0)映射为DbType.Int32,NUMBER(3,0)映射为DbType.Double

编辑

您正在尝试使用 ADO.NET 基类连接 oracle,您知道它甚至System.Data.OracleClient已被弃用。

System.Data.OracleClient 中的类型已弃用。这些类型在 .NET Framework 版本 4 中受支持,但将在未来版本中删除。Microsoft 建议您使用第三方 Oracle 提供商。

您最好使用Oracle Data Provider for .NET,这些错误中的大部分都会得到解决。

于 2012-06-22T09:09:28.537 回答