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

时间:2012-07-16 13:19:11

标签: c# oracle odp.net

您好我在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: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'GET_RIT_BY_USER_ID'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

我在c#代码中看不到任何错误。你会帮我吗?感谢

最好的问候

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:5)

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

所以:检查null s。

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);

答案 2 :(得分:3)

检查参数拼写,它必须匹配Store Procedure变量名,特别是,如果你有一个输出变量。我只花了几个小时来解决类似的问题,结果我拼错了我的输出参数名称。

答案 3 :(得分:0)

您有某种用户定义的类型,名为&#34; type_cursor&#34;但是绑定了一个SYS_REFCURSOR参数。这就是导致此错误的原因。

答案 4 :(得分:0)

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

在我们的示例中,正在从程序包的过程调用中返回确切的错误消息。经过10次验证Java代码,其参数和后端Package&#34; Body&#34;我们无法找出任何差异。

然后,我们注意到该包具有不同数量的参数的类似过程。 &#34; catch&#34;这里的包是没有使用从前端调用的新方法编译的。所以,它将采用旧程序。

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