por - PLS-00306: número incorrecto o tipo de error de argumentos en C#
pasar objetos como parametros en c# (3)
Este es uno de esos errores donde Oracle demuestra no ser un RDBMS amigable para desarrolladores. Por qué no pueden decirte cuál de esos dos problemas es el problema, no tengo ni idea. Tengo una larga lista de cosas para comprobar que se reduce a lo siguiente:
- Falta la coma
- Número incorrecto de parámetros
- El orden incorrecto de los parámetros y cmd.BindByName es falso
- Usar un parámetro dos veces y cmd.BindByName es falso (en el caso si sql en línea)
- Los tipos de datos en los parámetros coinciden. Para evitar problemas con esto, use la sobrecarga .Add ("paramName", value) para todos los parámetros de entrada y permita inferir el tipo.
Sin embargo, por lo que parece, creo que voy a agregar uno más a mi lista: asegúrese de llamar al procedimiento que cree que está llamando. Veo el calificador "TOU" en el procedimiento. Tengo que asumir que este es un esquema y no un paquete basado en el script sql. ¿Estás alterando el proceso en este esquema? Si elimina el nuevo parámetro en su código .net ¿funciona o recibe el mismo error? Debería obtener el mismo error, pero si no lo hace, podría estar cargando el nuevo proceso en el esquema incorrecto.
Lo último que puede hacer es comenzar con un shell de un proceso y agregar un proceso a la vez hasta que pueda descubrir qué está pasando.
Diré que tu int.Parse (id) es un poco extraño: ¿tus ID de usuario autenticados son solo impares? Pero en cualquier caso esperaría un error .net allí y no un error de oráculo.
Estamos utilizando un procedimiento almacenado de Oracle en un programa C #, que funcionaba bien hasta que agregamos la variable ''v_nameurn''.
Aquí está el procedimiento de Oracle:
create or replace procedure stats_By_Date (
v_SDate IN varchar2,
v_EDate IN varchar2,
v_user IN number,
v_nameurn IN number,
p_cursor OUT SYS_REFCURSOR
) as
BEGIN
OPEN p_cursor FOR
select T1.Staff_No,
T3.Title,
T2.Verno,
To_char(T1.Response_dt, ''DD/MM/YYYY''),
T5.Response,
T6.Forenames||'' ''||T6.Surname
from TOU.Users_version_link T1,
TOU.Version T2,
TOU.name T3,
TOU.Admin_Access T4,
Tou.CV_Response T5,
corp.wforce_employee@remote_DWLive T6
where T1.Version_urn=T2.Urn
and T1.Name_urn= T3.urn
and T3.urn = T4.name_urn
and T1.Response_urn=T5.urn
and T1.staff_no=T6.Staff_Number
and Trunc(T1.Response_dt) >= To_date(v_Sdate, ''DD/MM/YYYY'')
and Trunc(T1.Response_dt) <= To_date(v_EDate, ''DD/MM/YYYY'')
and T4.Staff_No = v_user
and T3.urn = v_nameurn;
End;
Y aquí está el código de C #:
this.ConnectToDb();
var cmd = new OracleCommand
{
Connection = cn,
CommandText = "TOU.Stats_By_Date",
CommandType = CommandType.StoredProcedure
};
var id = HttpContext.Current.User.Identity.Name.Split(''//')[1].ToString();
cmd.Parameters.Add("v_SDate", OracleDbType.Varchar2).Value =
startdate.ToString("dd-MM-yyyy");
cmd.Parameters.Add("v_EDate", OracleDbType.Varchar2).Value =
enddate.ToString("dd-MM-yyyy");
cmd.Parameters.Add("v_user", OracleDbType.Decimal).Value = int.Parse(id);
cmd.Parameters.Add("v_nameurn", OracleDbType.Decimal).Value = 3;
var rc = cmd.Parameters.Add("p_cursor", OracleDbType.RefCursor);
rc.Direction = ParameterDirection.Output;
cmd.ExecuteNonQuery();
this.DisconnectFromDb();
¿Alguna sugerencia sobre qué podría estar mal, por favor? Hay 5 variables en total en ambos fragmentos de código (4 en, 1 fuera), lo cual está bien y todos los tipos de datos parecen coincidir. También probé diferentes variaciones en la variable v_nameurn
real, así que probé 3, "3", y lo v_nameurn
como una variable Int de antemano.
Decimal is Oracle NUMBER type
. Cambie su tipo de datos para v_user
y ''v_nameurn''
cmd.Parameters.Add("v_user", OracleDbType.Decimal).Value = int.Parse(id);
cmd.Parameters.Add("v_nameurn", OracleDbType.Decimal).Value = 3;
cmd.Parameters.Add("v_user", OracleDbType.Decimal).Value = decimal.Parse(id);
cmd.Parameters.Add("v_nameurn", OracleDbType.Decimal).Value = 3m;
Debe usar un decimal cuando se trata de decimales. Para Oracle, los decimales no se traducen bien a los enteros y al revés.