I call my stored procedure from C# and I get the following exception:
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'MY_PROC'
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'MY_PROC'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
As my procedure has 57 arguments it is not easy to know where is really the problem. Is there a way to have a more detailed message ?
Note : However arguments type and number seem to match !
Here are my stored procedure arguments:
Var_PE_... IN NUMBER(8,0),
Var_PE_... IN NUMBER(4,0),
Var_PE_... IN NUMBER(3,0),
Var_PE_... IN DATE,
Var_PE_... IN DATE,
Var_PE_... IN NUMBER(2,0),
Var_PE_... IN NUMBER(4,0),
Var_PE_... IN NUMBER(4,0),
Var_PE_... IN NUMBER(8,0),
Var_PE_... IN NUMBER(7,0),
Var_PE_... IN VARCHAR2(1 BYTE),
Var_PE_... IN CHAR(1 BYTE),
Var_PE_... IN NUMBER(15,0),
Var_PE_... IN VARCHAR2(25 BYTE),
Var_PE_... IN VARCHAR2(25 BYTE)
Var_PE_... IN VARCHAR2(25 BYTE),
Var_PE_... IN VARCHAR2(25 BYTE),
Var_PE_... IN NUMBER(5,0),
Var_PE_... IN VARCHAR2(25 BYTE),
Var_PE_... IN VARCHAR2(25 BYTE),
Var_PE_... IN NUMBER(5,0),
Var_PE_... IN NUMBER(5,0),
Var_PE_... IN VARCHAR2(11 BYTE),
Var_PE_... IN NUMBER(2,0),
Var_PE_... IN CHAR(2 BYTE),
Var_PE_... IN VARCHAR2(17 BYTE),
Var_PE_... IN DATE,
Var_PE_... IN DATE,
Var_PE_... IN DATE,
Var_PE_... IN NUMBER(12,5),
Var_PE_... IN NUMBER(9,2),
Var_PE_... IN NUMBER(3,0),
Var_PE_... IN NUMBER(9,2),
Var_PE_... IN CHAR(2 BYTE),
Var_PE_... IN CHAR(3 BYTE),
Var_PE_... IN NUMBER(3,0),
Var_PE_... IN NUMBER(7,2),
Var_PE_... IN NUMBER(3,0),
Var_PE_... IN NUMBER(9,2),
Var_PE_... IN NUMBER(9,2),
Var_PE_... IN NUMBER(10,0),
Var_PE_... IN VARCHAR2(49 BYTE),
Var_PE_... IN CHAR(1 BYTE),
Var_PE_... IN CHAR(1 BYTE),
Var_PE_... IN CHAR(6 BYTE),
Var_PE_... IN CHAR(1 BYTE),
Var_PE_... IN NUMBER(9,2),
Var_PE_... IN VARCHAR2(13 BYTE),
Var_PE_... IN NUMBER(2,0),
Var_PE_... IN VARCHAR2(2 BYTE),
Var_PE_... IN DATE,
Var_PE_... IN DATE,
Var_PE_... IN VARCHAR2(1 BYTE),
Var_PE_... IN NUMBER(2,0),
Var_PE_... IN VARCHAR2(20 BYTE),
Var_PS... OUT VARCHAR2,
Var_PS... OUT VARCHAR2
And here is my call to this procedure from c#:
l_Params.Add(CreateInputDbParameter(DbType.Int32, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Date, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Date, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Date, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Date, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Date, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Double, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Double, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Double, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Double, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Double, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Double, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Double, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Double, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Date, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Date, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.Int32, 0, "PE_..."));
l_Params.Add(CreateInputDbParameter(DbType.AnsiString, 0, "PE_..."));
l_Params.Add(CreateOutputDbParameter(DbType.AnsiString, 2000, "PS_..."));
l_Params.Add(CreateOutputDbParameter(DbType.AnsiString, 2000, "PS_..."));
ExecuteStoreProcedure("MY_PROC", l_Params);
Home code for creating parameters:
public DbParameter CreateInputDbParameter(DbType typeParam, int sizeparam,
string nameParam, object valueParam)
{
DbParameter DbParam = Parameter;
DbParam.DbType = typeParam;
DbParam.Size = sizeparam;
DbParam.Direction = ParameterDirection.Input;
DbParam.ParameterName = nameParam;
if (valueParam == null)
{
DbParam.Value = DBNull.Value;
}
else
{
DbParam.Value = valueParam;
}
return DbParam;
}
public DbParameter CreateOutputDbParameter(DbType typeParam, int sizeparam, string nameParam)
{
DbParameter DbParam = Parameter;
DbParam.DbType = typeParam;
DbParam.Size = sizeparam;
DbParam.Direction = ParameterDirection.Output;
DbParam.ParameterName = nameParam;
return DbParam;
}
CreateOutputDbParameterandCreateInputDbParameter? - DamithDbParameter DbParam = new DbParameter();but assignParameter, any reason ? - DamithnameParamargument values passed to CreateInputDbParam and CreateOutputDbParam match the actual names of the parameters as defined in the procedure, and should thus be'Var_PE...', etc. - Bob Jarvis - Reinstate MonicaParameteris a getter onCommand.CreateParameter()- sinsedrix