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

C# ORA-06550:第1行第7列:PLS-00306:参数的数量或类型错误,c#,oracle,odp.net,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 OracleComm

我在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
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();
c#代码

PROCEDURE get_rit_by_user_id(KDC_KEY      IN VARCHAR2,
                             p_id_utente IN NUMBER,
                             p_cur_out   OUT type_cursor) IS
  BEGIN
    ...
    ...
    ...
  END
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:忽略语句


上面的代码有什么问题,它得到了
错误数量的参数类型
错误?

输入参数最常见的问题是
null
。如果
kfcKey
user\u id
null
(要么是一个null引用,要么是一个不带值的
null
),那么对于许多提供者(因此我假设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);

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

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

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


进程是否返回游标之外的结果集?如果不使用
ExecuteNonQuery
而不是
Execute

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

您有一种称为“type\u cursor”的用户定义类型,但正在绑定SYS\u REFCURSOR参数。这就是这个错误的原因。

我也遇到过类似的问题,发现根本原因很愚蠢。如果你的问题是类似的,这可能会帮助你

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

然后,我们注意到这个包有相似的过程,参数的数量不同。这里的“陷阱”是包不是用前端调用的新方法编译的。因此,它将进入旧程序


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

我在参数列表中遗漏了变量p\u id\u utete(尽管您有一个p\u用户)。另外两个在那里。这不是问题,我已经检查了所有参数的名称。你看了这个问题:好建议。我验证了这些值​​不为空,但错误仍然存在。为了确认Marc的上述假设,此修复程序已适用于
System.Data.OracleClient.OracleParameter
,适用于Me什么是
类型的光标
?这是REF CURSOR的别名吗?