2012-07-16 507 views
6

您好我在Oracle 11g服务器上调用存储过程时遇到问题。ORA-06550:第1行,第7列:PLS-00306:错误的参数数量或类型

这是我的存储过程

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#代码。你会帮我吗?感谢

问候

+1

我想念参数列表中的变量p_id_utente(尽管你有一个P_USER)。另外两个在那里。 – Independent 2012-07-16 13:21:56

+0

这不是问题,我已经检查了参数 – 2012-07-16 13:25:17

+0

的所有名称你看过这个SO问题:http://stackoverflow.com/questions/6360244/how-to-call-an-oracle-function-带有-ref-cursor-as-out-parameter-from-c – DCookie 2012-07-16 20:09:15

回答

5

最常见的问题与输入参数是null。如果kfcKeyuser_idnull(一个空引用或Nullable<T>没有值),那么对于许多供应商(我假设,因此甲骨文太)它将不添加参数。要通过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); 
+0

好的建议。我确认这些值不为空,但错误依然存在。 – 2012-07-16 13:45:17

+0

为了证实上面的Marc的假设,这个修复对我来说已经适用于'System.Data.OracleClient.OracleParameter' – jlb83 2017-03-28 10:50:38

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

+0

我试着改成Decimal,但是错误总是一样的...... – 2012-07-16 13:39:27

+0

什么是'type_cursor'?这是REF CURSOR的别名吗? – 2012-07-16 14:14:00

2

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

0

你有某种所谓的“type_cursor”用户定义类型的但结合SYS_REFCURSOR参数。这是这个错误的原因。

0

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

在我们的情况下,正从包的过程调用返回的确切的错误消息。经过10次验证Java代码,其参数和后端Package“Body”及其程序后,我们无法找出任何差异。

然后,我们注意到,这包有不同数量的参数类似的程序。而且这里的“catch”是这个包没有用前端调用的新方法编译。所以,这是旧的程序。

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