Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    Store procedure su Oracle

    Salve.

    Ho un problema strano sul lancio di procedure pl/sql da una classe java. Il metodo che uso funziona perchè l'avrò usato altre 100 volte senza nessuna complicazione. In questo particolare caso però mi da un errore.
    Ma andiamo con ordine. Dunque, io mi creo la mia bella stringa sulla base delle selezioni fatte dall'utente a video, ed ottengo qualcosa di simile a questa:
    codice:
    begin package.procedure('2', 'N'); end;
    Ora, se io prendo questa stringa (che mi faccio anche scrivere sui log) e la lancio da sqlplus, va tutto bene ed arriva al fondo senza nessun errore.
    La mia classe java apre una connessione e sottomette la stringa (ripeto, metodo usato altre volte) ma questa si blocca a causa di un errore di conversione numerica (ORA-01722: Invalid number). Subito ho pensato che il problema fosse il primo parametro, quel 2 passato tra apici, e invece non è così. Andando a commentare un po' di codice qua e là, ho scoperto dov'è che si blocca: la procedura legge i dati da un file di testo e li va a scrivere su una tabella. Siccome legge anche un importo che ci arriva con il punto come separatore di decimali, noi lo andiamo a sostituire con la virgola e ne facciamo la to_number (se non facessimo questa conversione, lanciandola da sqlplus va in errore).
    La cosa che mi lascia perplesso è che non va in errore java, ma quella stessa procedura pl/sql che lanciata a mano funziona liscia come l'olio!

    A questo punto la mia domanda è: perchè ci sono comportamenti diversi sul db a seconda di chi lancia la procedura? C'è da impostare qualcosa nell'interfaccia tra java e oracle che per queste particolari situazioni è indispensabile?

    Se può servire, ecco il metodo java che utilizzo:
    codice:
    public int executeNonQuery(String sqlString) throws Exception {
      Connection conn = DbConnection.getConnection(); 
      Statement st = null;
      int numRec;
      try {
        st = conn.createStatement();
        numRec = st.executeUpdate(sqlString);
        st.close();
        return numRec;
      }
      finally {
        try {
          if (st != null) {
            st.close();
          }
        }
        catch(Exception ex) {
          //ignora eventuali errori
        }
        DbConnection.freeConnection(conn);
      }
    }

  2. #2
    Ho risolto , anche se la cosa mi lascia un po' perplesso.

    In pratica, essendo la macchina con l'application server in inglese, era come se java chiamasse oracle in inglese, prevedendo quindi il punto come separatore di migliaia. Perchè non comanda la lingua del db? Così è uguale da ovunque io mi colleghi!! Va bhè...
    Ad ogni modo, mi è bastato aggiungere nel costruttore della classe che si interfaccia al database la riga
    codice:
    Locale.setDefault(Locale.ITALY)
    e così viene aperta la connessione in italiano e quindi con la virgola come separatore decimale.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.