6

我在 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错误?

4

5 回答 5

7

您的第二个参数是 a 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

于 2012-07-16T13:30:29.013 回答
6

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

所以:检查nulls。

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);
于 2012-07-16T13:27:49.590 回答
3

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

于 2013-02-27T19:34:06.657 回答
0

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

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

然后,我们注意到该包具有类似的过程,但参数数量不同。这里的“问题”是包没有使用从前端调用的新方法编译。所以,它要走旧程序。

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

于 2015-02-10T08:19:29.453 回答
0

您有某种名为“type_cursor”的用户定义类型,但正在绑定一个 SYS_REFCURSOR 参数。这就是这个错误的原因。

于 2014-12-04T05:40:23.203 回答