2012-07-16 21 views
6

Hola Tengo un problema con el procedimiento de llamada de la tienda en el servidor Oracle 11g.ORA-06550: línea 1, columna 7: PLS-00306: número incorrecto o tipos de argumentos

esta es mi procedimiento almacenado

PROCEDURE get_rit_by_user_id(KDC_KEY  IN VARCHAR2, 
          p_id_utente IN NUMBER, 
          p_cur_out OUT type_cursor) IS 
    BEGIN 
    ... 
    ... 
    ... 
    END 

este es mi código 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() lanzar esta excepción

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 

no puedo ver nada malo en mi código C#. ¿Me ayudarás? gracias

Saludos

+1

Extraño la variable p_id_utente en la lista de parámetros (sin embargo, tiene un P_USER). Los otros dos están ahí. – Independent

+0

este no es el problema, he comprobado todos los nombres de los parámetros –

+0

¿Ha mirado esta pregunta SO: http://stackoverflow.com/questions/6360244/how-to-call-an-oracle-function- with-a-ref-cursor-as-out-parameter-from-c – DCookie

Respuesta

5

El problema más común con parámetros de entrada es null. Si kfcKey o user_id es null (ya sea una referencia nula, o Nullable<T> sin un valor), entonces para muchos proveedores (y supongo que también Oracle) no agregará el parámetro. Para pasar un null, generalmente debe pasar DBNull.Value en su lugar.

Así que, busque 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); 
+0

buena sugerencia. Verifiqué que los valores no son nulos, pero el error permanece. –

+0

Para confirmar la suposición anterior de Marc, esta corrección ha funcionado para 'System.Data.OracleClient.OracleParameter' para mí – jlb83

6

Su segundo parámetro es un NUMBER, no un número entero. Cambiar el segundo tipo de parámetro a OracleDbType.Decimal

http://docs.oracle.com/cd/B19306_01/win.102/b14307/OracleDbTypeEnumerationType.htm

También comprobar la sintaxis de sus Add métodos. Puede ser mejor por ahora para especificar las propiedades de los parámetros de forma más explícita, aunque hace que el código un poco más detallado:

cmd.Parameters.Add(
    new OracleParameter() 
     { 
      ParameterName="KDC_KEY", 
      DbType=OracleDbType.Varchar2, 
      Value=kdcKey, 
      Direction=ParameterDirection.Input 
     } 
    ); 

etc.

es el Procedimiento de devolver un conjunto de resultados además de la cursor? Si no utiliza ExecuteNonQuery en lugar de Execute

+0

He intentado cambiar a Decimal, pero el error es siempre el mismo ... –

+0

¿Qué es' type_cursor'? ¿Es ese un alias para REF CURSOR? –

2

Compruebe la ortografía de sus parámetros, debe coincidir con el nombre de la variable de procedimiento de almacenamiento, especialmente si tiene una variable de salida. Acabo de pasar unas horas solucionando un problema similar, resultó que había escrito incorrectamente mi nombre de parámetro de salida.

0

Tiene algún tipo de tipo definido por el usuario llamado "type_cursor" pero está vinculando un parámetro SYS_REFCURSOR. Esa es la causa de este error.

0

Tuve un problema similar y encontré la causa raíz tonta. Si su problema es similar, esto puede ayudarlo.

En nuestro caso, el mensaje de error exacto se devuelve desde la llamada de procedimiento de un paquete. Después de 10 veces de validar el código Java, sus parámetros y el paquete final "Body" y su procedimiento no pudimos encontrar ninguna diferencia.

Luego, notamos que ese paquete tiene un procedimiento similar con diferentes parámetros. Y la "captura" aquí es que el paquete no se compiló con el nuevo método que se llama desde el front-end.Entonces, va al viejo procedimiento.

Por favor, compruebe si esto es igual con su caso.

Cuestiones relacionadas