2012-07-16 24 views
6

Ciao, ho un problema con la procedura di chiamata del negozio sul server Oracle 11g.ORA-06550: riga 1, colonna 7: PLS-00306: numero errato o tipi di argomenti

questo è il mio stored procedure

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

questo è il mio codice 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() lanciare questa eccezione

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 

non riesco a vedere nulla di male nel mio codice C#. Mi aiuterai? grazie

migliori saluti

+1

Mi manca la variabile p_id_utente nell'elenco dei parametri (avete però un P_USER). Gli altri due sono lì. – Independent

+0

questo non è un problema, ho controllato tutti i nomi dei parametri –

+0

Hai guardato questa domanda SO: http://stackoverflow.com/questions/6360244/how-to-call-an-oracle-function- con-a-ref-cursor-as-out-parameter-from-c – DCookie

risposta

5

Il problema più comune con parametri di input è null. Se kfcKey o user_id è null (sia un null riferimento, o un Nullable<T> senza un valore), poi per molti fornitori (e Ritengo pertanto Oracle troppo) che non aggiungerà il parametro. Per passare un null, in genere è necessario passare DBNull.Value.

Quindi: verificare per 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

buon suggerimento. Ho verificato che i valori non sono nulli, ma l'errore rimane. –

+0

Per confermare l'ipotesi di Marc sopra, questa correzione ha funzionato per 'System.Data.OracleClient.OracleParameter' per me – jlb83

6

Il secondo parametro è un NUMBER, non un numero intero. Modificare il secondo tipo di parametro per OracleDbType.Decimal

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

controllare anche la sintassi del Add metodi. Essa può essere meglio per ora per specificare le proprietà dei parametri in modo più esplicito, anche se questo rende il codice un po 'più dettagliato:

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

ecc

è il proc restituire un set di risultati oltre al Cursore? In caso contrario, utilizzare ExecuteNonQuery anziché Execute

+0

Ho provato a cambiare in Decimal, ma l'errore è sempre lo stesso ... –

+0

Che cos'è' type_cursor'? È un alias per REF CURSOR? –

2

Controllare l'ortografia dei parametri, deve corrispondere al nome della variabile Procedura di archiviazione, specialmente se si dispone di una variabile di uscita. Ho appena trascorso alcune ore a risolvere un problema simile, ho scoperto che avevo sbagliato a digitare il mio nome del parametro di output.

0

Si dispone di una sorta di tipo definito dall'utente denominato "tipo_cursore" ma che associa un parametro SYS_REFCURSOR. Questa è la causa di questo errore.

0

Ho avuto un problema simile e ho trovato la causa principale sciocca. Se il tuo problema è simile, questo potrebbe aiutarti.

Nel nostro caso, il messaggio di errore esatto viene restituito dalla chiamata di procedura di un pacchetto. Dopo 10 volte che convalidano il codice Java, i suoi parametri e il pacchetto back-end "Body" e la sua procedura non siamo riusciti a capire le differenze.

Quindi, abbiamo notato che quel pacchetto ha una procedura simile con un numero diverso di parametri. E il "fermo" qui è che il pacchetto non è stato compilato con il nuovo metodo che viene chiamato dal front-end.Quindi, sta andando alla vecchia procedura.

Si prega di verificare se questo è lo stesso con il tuo caso.

Problemi correlati