none
Passare tre parametri a un package Oracle RRS feed

  • Domanda

  • Un saluto a tutti.

    Con questo codice dovrei passare tre parametri ad un package Oracle, ma alla fine la Select sulla vista non produce record

    Dim sPrest As String = sdrAgePrest(0).ToString

    Dim sAgenda As String = sdrAgePrest(1).ToString

    Dim sDataI As String = "20190304"
                                  
    Using okSPPrest As New OracleClient.OracleCommand
     okSPPrest.CommandText = "pkg_input_vw_parameters"
     okSPPrest.CommandType = CommandType.StoredProcedure
     okSPPrest.Parameters.Add("set_cd_prestaz_ente", OracleType.VarChar).Value = sPrest
     okSPPrest.Parameters.Add("set_cd_agenda", OracleType.VarChar).Value = sAgenda
     okSPPrest.Parameters.Add("set_data_inizio", OracleType.VarChar).Value = sDataI
     okSPPrest.Connection = CnnOracolo
    End Using
    okSelAC.CommandText = "SELECT * FROM VW_GG_CAL_GEN_NO_LIMITI"

    odrSelCale = okSelAC.ExecuteReader

    Mentre questo package al quale passo solo un parametro restituisce i record correttamente

    Using okSPDataIni As New OracleClient.OracleCommand
     Dim sParam As String = "20190304"
            okSPDataIni.CommandType = CommandType.StoredProcedure
            okSPDataIni.CommandText = "pkg_input_vw_parameters.set_data_inizio('" & sParam & "')"
            okSPDataIni.Connection = CnnOracolo
    End Using
    okSelPrestAtt.CommandText = "SELECT * FROM VW_GG_PREST_PREN_LP"
    Dim odrSelPrestAtt As OracleClient.OracleDataReader
    odrSelPrestAtt = okSelPrestAtt.ExecuteReader()

    Cosa c'è di sbagliato nell'utilizzo del primo OracleCommand?

    Grazie 

    Ciao

    Giovanni

    lunedì 4 marzo 2019 17:55

Tutte le risposte

  • Buongiorno,

    io non sono una esperta in Oracle, ma sicuramente una query parametrica SQL ha questo formato:

    SELECT * FROM VW_GG_PREST_PREN_LP
    WHERE campo1=@Parametro1 AND campo2=@Parametro2 AND campo3=@Parametro3

    La stessa modalità di nomenclatura dei parametri viene usata anche per le Stored Procedure, come quella che chiami tu nel tuo primo esempio.

    Pertanto potrebbe semplicemente essere che devi sostituire:

    okSPPrest.Parameters.Add("set_cd_prestaz_ente", OracleType.VarChar).Value = sPrest

    Con

    okSPPrest.Parameters.Add("@set_cd_prestaz_ente", OracleType.VarChar).Value = sPrest
    E fare lo stesso per tutti i parametri.



    Sabrina C. - http://www.dotnetwork.it

    martedì 5 marzo 2019 10:24
  • Grazie per le info, ho provato ma non cambia nulla.

    Quello che non capisco è che se utilizzo un solo parametro il tutto funziona.

    Ad esempio questo non fa una piega il DateReader viene popolato:

    Using okUpdatePar As New OracleClient.OracleCommand
     okUpdatePar.CommandType = CommandType.StoredProcedure
            okUpdatePar.CommandText = "pkg_input_vw_parameters"
     okUpdatePar.Parameters.Add("set_data_inizio", OracleType.VarChar).Value = "20190301"
            okUpdatePar.Connection = CnnOracolo
    End Using

    okSelPGI.CommandText = "SELECT * FROM VW_GG_PRENOTAZIONI_PER_GIORNO"
    okSelPGI.Connection = CnnOracolo
    Dim odrSelPGI As OracleClient.OracleDataReader
    odrSelPGI = okSelPGI.ExecuteReader

    Grazie.

    Ciao

    martedì 5 marzo 2019 17:55
  • Allora,

    per quel che posso vedere, stai chiamando una stored procedure, le stored procedure ti ritornano il risultato di una select già pronto, infatti, nella prima parte del tuo codice, il command Type viene predisposto come Stored Procedure ed il Comand Text è il nome della stored procedure, quindi il parametro passato è un parametro della stored procedure.

    Nel secondo pezzo del codice invece hai impostato una Select dei dati restituiti da una stored procedure, ma mi risulta che questo non puoi farlo.

    Non puoi inserire una chiamata a stored procedure in una select, se hai bisogno di fare questo, devi utilizzare una User Defined Function, non una stored procedure.

    Ti consiglio di provare ad eseguire il codice sull'equivalente di Sql Management Studio di Oracle per verificare che la query sia corretta prima di provare ad eseguirla da Ado.Net

    saluti


    Sabrina C. - http://www.dotnetwork.it

    mercoledì 6 marzo 2019 08:31
  • Queste righe ad esempio eseguite dall'IDE di Visual Studio 2010 restituiscono i dati in base ai parametri passati.

    EXEC pkg_input_vw_parameters.set_data_inizio('20190301');
    EXEC pkg_input_vw_parameters.set_cd_agenda('CH5801D1A03');
    EXEC pkg_input_vw_parameters.set_cd_prestaz_ente('CH4516');
    SELECT * FROM VW_GG_CAL_GEN_NO_LIMITI;

    Un volta inserite nel codice VB la select ( "SELECT * FROM VW_GG_CAL_GEN_NO_LIMITI") sulla vista non restituisce record.

    Grazie

    Ciao

    Giovanni

    mercoledì 6 marzo 2019 11:27
  • Hai provato a inserire i 4 comandi che chiami nel command text per vedere cosa succede?

    OracleCommand cmd = new OracleCommand();
    
    cmd.CommandText = @"
    EXEC pkg_input_vw_parameters.set_data_inizio('20190301');
    EXEC pkg_input_vw_parameters.set_cd_agenda('CH5801D1A03');
    EXEC pkg_input_vw_parameters.set_cd_prestaz_ente('CH4516');
    SELECT * FROM VW_GG_CAL_GEN_NO_LIMITI;";
    
    

    Saluti


    Sabrina C. - http://www.dotnetwork.it

    giovedì 7 marzo 2019 10:52
  • Si avevo già provato con i primi tre ed eseguire poi la select.

    Ora ho provato con tutti e quattro ma al momento di eseguire questa:

    Dim odrSelCale As OracleClient.OracleDataReader

    odrSelCale = okSPPrest.ExecuteReader

    mi da questo errore:

    ORA-06550: riga 1, colonna 12:
    PLS-00103: Trovato il simbolo "PKG_INPUT_VW_PARAMETERS" anziché uno dei seguenti:
      := . ( @ % ;
    Il simbolo ":=" è stato sostituito per permettere a "PKG_INPUT_VW_PARAMETERS" di continuare.
    ORA-06550: riga 1, colonna 69:
    PLS-00103: Trovato il simbolo "PKG_INPUT_VW_PARAMETERS" anziché uno dei seguenti:
      := . ( @ % ;
    Il simbolo ":=" è stato sostituito per permettere a "PKG_INPUT_VW_PARAMETERS" di continuare.
    ORA-06550: riga 1, colonna 127:
    PLS-00103: Trovato il simbolo "PKG_INPUT_VW_PARAMETERS" anziché uno dei seguenti:
      := . ( @ % ;
    Il simbolo ":=" è stato sostituito per permettere a "PKG_INPUT_VW_PARAMETERS" di continuare.
    ORA-06550: riga 1, colonna 181:
    PLS-00103: Trovato il simbolo "SELECT * FROM VW_GG_CAL_GEN_NO_LIMITI" anziché uno dei seguenti:

      ( begin case declare end exception exit for goto if loop mod
      null pragma raise return select update while with
      <un identificativo>

    Ciao

    Grazie

    Giovanni

    giovedì 7 marzo 2019 11:40
  • Non saprei, non conoscendo oracle, in SqlServer non si può utilizzare EXEC direttamente da Ado.net se non ricordo male ma bisogna usare la Stored procedure

    Sp_executesql a cui si passa lo stringone magari anche oracle ha qualcosa di simile.

    Però l'errore sembra indicare che si aspetterebbe qualcosa con il carattere @ o % ma non è così.

    Anche perché dice che sostituisce := con qualcosa di diverso ma nella tua query non vedo nulla di tutto ciò, quindi a questo punto non so come aiutarti.

    ciao


    Sabrina C. - http://www.dotnetwork.it

    giovedì 7 marzo 2019 11:48
  • OK, grazie comunque

    Ciao

    Giovanni

    giovedì 7 marzo 2019 14:30