ORA-06550:第1行,第7列:PLS-00306:错误的参数数目或类型

问题描述 投票:6回答:5

我在Oracle 11g服务器上调用存储过程时遇到问题。

存储过程

PROCEDURE get_rit_by_user_id(KDC_KEY      IN VARCHAR2,
                             p_id_utente IN NUMBER,
                             p_cur_out   OUT type_cursor) IS
  BEGIN
    ...
    ...
    ...
  END

c#代码

OracleCommand cmd = new OracleCommand();
cmd.Connection = oracleConnection;
cmd.CommandText = userIdEsercizio + packageName + "GET_RIT_BY_USER_ID";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("KDC_KEY", OracleDbType.Varchar2, kdcKey, ParameterDirection.Input);
cmd.Parameters.Add("P_ID_UTENTE", OracleDbType.Int32, user_id, ParameterDirection.Input);
cmd.Parameters.Add("P_CUR_OUT", OracleDbType.RefCursor, ParameterDirection.Output);

OracleDataReader reader = cmd.ExecuteReader();

cmd.ExecuteReader()引发此异常:

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

上面的代码出现wrong number of types of arguments错误,这怎么了?

c# oracle odp.net
5个回答
6
投票

您的第二个参数是NUMBER,而不是整数。将第二个参数类型更改为OracleDbType.Decimal

http://docs.oracle.com/cd/B19306_01/win.102/b14307/OracleDbTypeEnumerationType.htm

也请检查Add方法的语法。现在最好更明确地指定参数属性,即使这会使代码更加冗长:

cmd.Parameters.Add(
    new OracleParameter() 
        {
            ParameterName="KDC_KEY", 
            DbType=OracleDbType.Varchar2, 
            Value=kdcKey, 
            Direction=ParameterDirection.Input
        } 
    );

其他

proc是否返回结果集除了游标?如果不使用,请使用ExecuteNonQuery代替Execute


5
投票

输入参数最常见的问题是null。如果kfcKeyuser_idnull(空引用或无值的Nullable<T>),那么对于许多提供程序(因此我也假定为Oracle),它不会添加参数。要传递null,通常需要传递DBNull.Value

所以:请检查null

cmd.Parameters.Add("KDC_KEY", OracleDbType.Varchar2,
    (object)kdcKey ?? DBNull.Value, ParameterDirection.Input);
cmd.Parameters.Add("P_ID_UTENTE", OracleDbType.Int32,
    (object)user_id ?? DBNull.Value, ParameterDirection.Input);

3
投票

检查参数拼写,特别是如果您有输出变量,它必须与存储过程变量名匹配。我只花了几个小时对一个类似的问题进行故障排除,结果发现我的输出参数名称拼写错误。


0
投票

您具有一种称为“ type_cursor”的用户定义类型,但是正在绑定SYS_REFCURSOR参数。这就是导致此错误的原因。


0
投票

我经历了类似的问题,发现根本原因很愚蠢。如果您的问题相似,这可能会对您有所帮助。

在我们的例子中,确切的错误消息是从程序包的过程调用中返回的。在验证Java代码,其参数以及后端程序包“ Body”及其过程十次之后,我们无法找出任何差异。

然后,我们注意到该程序包具有类似的过程,但参数数量不同。而且这里的“捕获”之处在于,该包未使用从前端调用的新方法进行编译。因此,它将转到旧过程。

请检查是否与您的情况相同。

© www.soinside.com 2019 - 2024. All rights reserved.