2015-07-03 24 views
7

Ho un procedimento di memorizzazione oracolo che prendono 2 stringhe e una data in parametter ingresso e che danno un cursore ref come uscita:Call stored procedure Oracle con EF sicuro

CREATE OR REPLACE PROCEDURE SCHEMA.MYPROSTO (
    pPl IN  VARCHAR2, -- Comma (;) separated 
    pTy IN  VARCHAR2,-- Comma (;) separated 
    pDate  IN  mytable.mydate%TYPE, 
    pCursor  OUT sys_refcursor) 
IS 
    ..... 
    sSQL  VARCHAR2 (3000); 
BEGIN 

    -- making SQL Order 
    sSQL := 'SELECT TO_CHAR (v.date_c........ 

    ...... 


    OPEN pCursor FOR sSQL; 

END MYPROSTO; 

Il cursore uscita restituire un set di 3 righe di celle stringa.

ho importato questa stored procedure nella mia entità modello di riferimento, con questo nel file .config:

<oracle.manageddataaccess.client> 
<version number="*"> 
    <implicitRefCursor> 
    <storedProcedure schema="SCHEMA" name="MYPROSTO"> 
     <refCursor name="PCURSOR"> 
     <bindInfo mode="Output"/> 
     <metadata columnOrdinal="0" columnName="YEAR" providerType="Varchar2" allowDBNull="true" nativeDataType="Varchar2"/> 
     <metadata columnOrdinal="1" columnName="MONTH" providerType="Varchar2" allowDBNull="true" nativeDataType="Varchar2"/> 
     <metadata columnOrdinal="2" columnName="COUNT" providerType="Varchar2" allowDBNull="true" nativeDataType="Varchar2"/> 
     </refCursor> 
    </storedProcedure> 
    </implicitRefCursor> 
</version> 
</oracle.manageddataaccess.client> 

La Wizzard funzione di importazione creato un oggetto risultato e ha generato una funzione di accesso:

public virtual ObjectResult<MYPROSTO_Result> MYPROSTO (string pPL, string pTY, Nullable<System.DateTime> pDATE) 
{ 
    var pPLParameter = pPL!= null ? 
     new ObjectParameter("PPL", pPL) : 
     new ObjectParameter("PPL", typeof(string)); 

    var pTYParameter = pTY!= null ? 
     new ObjectParameter("PTY", pTY) : 
     new ObjectParameter("PTY", typeof(string)); 

    var pDATEParameter = pDATE.HasValue ? 
     new ObjectParameter("PDATE", pDATE) : 
     new ObjectParameter("PDATE", typeof(System.DateTime)); 

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<MYPROSTO_Result>("MYPROSTO", pPLParameter, pTYParameter, pDATEParameter); 
} 

Tuttavia, la chiamata a questa funzione genera un'eccezione (System.Data.Entity.Core.EntityCommandExecutionException) sull'ultima riga:

ORA-06550: Ligne 1, colonne 8 : PLS-00306: wrong number or types of arguments in call to 'MYPROSTO' 
ORA-06550: Ligne 1, colonne 8 : PL/SQL: Statement ignored 

non vedo il motivo per fallire

+0

È ok che pDate sia mappato su un VARCHAR2? – bubi

+0

Che cosa intendi? Suggerite di provare a passare un varchar invece di una data nella mia stored procedure? –

+0

Hai provato a dare un'occhiata a http://docs.oracle.com/cd/E51173_01/win.122/e17732/featImplRefCursor.htm#ODPNT321? Inoltre, prova a cambiare 'Varchar2' in' varchar2' nel tipo di dati nativo (basta seguire il manuale qui, è Oracle, non si sa mai). – flindeberg

risposta

3

Sembra che ci sia una serie di problemi:

  • Invio di un varchar (2) in un campo data
  • Il nome di un parametro "PTY "contro "PTYPE"
  • Il nome di un parametro "PPL" contro "pPlant"
  • Il nome di un parametro "PPLT" contro "PPL"
+0

Si è verificato un errore nel processo di annonimizzazione, vedere la mia modifica –

+0

Ciò potrebbe spiegare 2 dei punti sopra ma non tutti i 4 –

+0

Risolti per l'ultimo errore di battitura. Tuttavia, dove vedi un varchar2 in una data? –

0

E il parametro di ritorno. È "mappato" ok? DoubleCheck

0

Sicuramente la risposta è chiara nel messaggio di errore:

"numero o il tipo di argomenti nella chiamata a 'MYPROSTO' sbagliato"

La procedura prevede 4 parametri, ma si sono solo passando 3. È necessaria una variabile di uscita per il cursore.

0

Ho avuto la stessa cosa a me e FINALMENTE ho risolto. Stavo usando oracle.manageddataaccess.client, come te, e ho diviso la mia soluzione .NET in un progetto di presentazione, un progetto WebAPI e un progetto di accesso ai dati. La mia app.config nel progetto Data Access aveva la sezione ImplicitRefCursor corretta con la definizione del cursore e i metadati come hai, ma ho dimenticato di copiarla anche nel mio web.config del mio progetto WebAPI. Una volta fatto ciò, il mio errore "numero errato o tipi di argomenti" è andato via. Spero possa aiutare. (Ho appena copiato l'intera sezione oracle.manageddataaccess.client.)

Inoltre, se si generava manualmente tutta la sezione ImplicitRefCursor, ho scoperto un modo molto più semplice e affidabile per farlo. Da .NET Server Explorer, connettersi al database, trovare la procedura memorizzata, fare clic con il tasto destro del mouse su di essa e RUN. Allora OK. Verrà visualizzato un elenco di parametri IN e OUT, compreso il cursore. Se fai clic sul pulsante Show Config, mostrerà ciò che deve essere presente nell'app EF.config. E il pulsante AddConfig lo aggiungerà per te. Questo aiuta a evitare errori.

Problemi correlati