C# ORA-06550:第1行第7列:PLS-00306:参数的数量或类型错误
我在Oracle 11g服务器上调用存储过程时遇到问题 存储过程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
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的别名吗?