referencia por pasar pasaje parametros parametro objetos expresiones como clase c# oracle plsql odp.net

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;

OracleDbType Enumeration


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.