Newsgroup: it.comp.java
Titolo: problemi con l'inserimento di una data con oracle 9i lite

ho qualche problema sull'inserimento di una data nel db oracle ... ho gia
speso 5 ore .. e non ho risolto nulla !!!!
quando hai 2 minuti ci puoi dare un'occhiata ....
la data è  l'ottengo da un input type="text" del tipo 23/05/2004 Stringa
1- questa è la tabella
CREATE TABLE AnnuncioVendita(
codiceAnnuncio number(7,0) PRIMARY KEY,
Data date NOT NULL,
PrezzoVendita numeric(7,2),
Note VARCHAR(150),
Immobile number(7) REFERENCES Immobile(codiceImmobile)
);
2-
 public static String formattaDataPerSalvataggio(String data) {
  if ((data==null)||(data.trim().equals(""))) return "NULL";
  Calendar cal = Calendar.getInstance();
  cal.set(Calendar.DAY_OF_MONTH,(new
Integer(data.substring(0,2))).intValue());
  cal.set(Calendar.MONTH,(new Integer(data.substring(3,5))).intValue()-1);
  cal.set(Calendar.YEAR,(new Integer(data.substring(6))).intValue());
  return "'"+formatta("yyyy-dd-MM",cal.getTime())+"'";   file://Per
Oracle ----> questa è quella che mi sono
}
 private static String formatta(String formato, Date data) {
   if (data==null) return "";
   SimpleDateFormat formatter = new SimpleDateFormat (formato);
   return formatter.format(data);
 }
3-
e questo è l'sql per l'nserimento ...
st.executeUpdate("INSERT INTO AnnuncioVendita values
(codiceAnnuncio.nextval,
"+Util.Utility.formattaDataPerSalvataggio(p.getData())+
     " , "+p.getPrezzoVendita()+
     " , '"+SQLUtil.escapeChar(p.getNote())+
     "', "+p.getCodiceImmobile()+" ) ");
ho provato anche con :
("INSERT INTO AnnuncioVendita values (codiceAnnuncio.nextval,
to_date("+Util.Utility.formattaDataPerSalvataggio(p.getData())+", 'YY/DD/MM
HH24:MI') "+
     " , "+p.getPrezzoVendita()+
     " , '"+SQLUtil.escapeChar(p.getNote())+
     "', "+p.getCodiceImmobile()+" ) ");
dov'è che sbaglio ? grazie anticipatamente !!!
salutirob

 [...] 
Anche se dal tuo post non capisco cosa succeda nel tuo programma (magari 
un'altra volta ricordati di postare l'eccezione :) ...) mi permetto di 
sparare un po' di sentenze sul tuo caso.
1.
In generale se invece di
	st.executeUpdate("INSERT INTO TABELLA VALUES(" + campi + ")");
fai
	String sql = "INSERT INTO TABELLA VALUES(" + campi + ")";
	System.out.println(sql);
	st.executeUpdate(sql);
almeno sei in grado di vedere che cosa stai dicendo al db
2.
Hai una roba che si chiama "Util.Utility.formattaDataPerSalvataggio", è 
questo è già di per sè almeno un problema (anche più d'uno, 
probabilmente...)
3.
Presumo che
	formatta("yyyy-dd-MM",cal.getTime())
ti restituisca una data in formato yyyy-dd-MM e più sotto al to_date di 
oracle dici che gli stai dando la data nel formato YY/DD/MM HH24:MI
4.
Perchè ti devi rovinare la vita a formattare date e concatenare 
stringhe? Prova una cosa del genere:
final String sql = "INSERT INTO ANNUNCIOVENDITA 
VALUES(CODICEANNUNCIO.NEXTVAL,?,?,?,?)";
PreparedStatemet pst = connessioneAlDb.prepareStatement("");
pst.setDate(1,unaDataNelSensoDiJavaUtilDate);
pst.setDouble(2,ilSecondoPuntoDiDomanda);
pst.setString(3,ilTerzoPuntoDiDomanda);
pst.setLong(4,ilQuartoPuntoDiDomanda);
pst.execute();
vedrai che ti trovi meglio :)
Sperando di non averti tediato,
	Giorgio

grazie Giorg (re della foresta...... informatica  :-)
saluti rob .. e a buon rendere !!!
Giorgio Gallo <giorg...@RMVoverlord.it> wrote in message
c8u3bg$ci2$1...@balena.cs.interbusiness.it...


scusa Giorgio .... ho scoperto una cosa bruttissima , in realtà non era la
data a darmi problemi bensì il campo PrezzoVendita
il metodo p.getPrezzoVendita() mi restituisce un double ,
la tabella è
CREATE TABLE AnnuncioVendita(
codiceAnnuncio number(7,0) PRIMARY KEY,
Data date NOT NULL,
PrezzoVendita number,  <------- ho provato con number(7,2)  anche con
numeric !!!!
Note VARCHAR(150),
Immobile number(7) REFERENCES Immobile(codiceImmobile)
);
ho sbagliato il tipo di dato della tabella ???
esiste qualche altro tipo che può contenere valori del tipo XXXXXX.XX
grazie anticipatamente roberto
(-: spero tanto che non te la sei presa per il Re Giorg  'ironico'  :-)
saluti Rob

 
il NUMBER dovrebbe andare benissimo (almeno, io non ho mai avuto 
problemi...)
Non è che oracle si aspetta una virgola (invece di un punto) come 
separatore decimale?
Se sì attento che ti capiterà (legge di murphy) che qualcuno usi il tuo 
programma da un sistema in inglese e che quindi formattare semplicemente 
il double usando la virgola come separatore non è una soluzione.
Dovresti dire a oracle che hai intenzione di usare il punto (o la 
virgola, il cancelletto, ...) come separatore decimale
Quest'ultima cosa si fa se non ricordo male eseguendo
ALTER SESSION SET nls_numeric_characters = '.,'
o
CALL DBMS_SESSION.SET_NLS('nls_numeric_characters', '''.,''')
attenzione: non sono sicuro che la sintassi sia giusta (non ho oracle a 
case e neanche un manuale, sob)
Finita la parte interessante riatacco con la predica: guarda che i 
PreparedStatement sono di gran lunga più comodi di quanto non sembri a 
prima vista e fanno risparmiare un sacco di tempo (secondo me rendono 
anche il codice più leggibile)
I PreparedStatement sono anche più performanti (con oracle, almeno): 
infatti se esegui
SELECT * FROM DUAL WHERE 1 = 1
e
SELECT * FROM DUAL WHERE 2 = 2
per oracle sono due query diverse, il che significa che se le parsa e 
individua il piano di esecuzione (si dice così in italiano?) due volte.
Se invece fai la stessa cosa con (anche due diversi) PreparedStatement, 
per oracle la query è sempre
SELECT * FROM DUAL WHERE ? = ?
e può mantenere una versione parsata e pianificata della query in cahce 
(una cosa del genere si può fare anche da procedure PL/SQL - credo si 
chiami parameter binding)
Prova a fare un test eseguendo qualche migliaio query che differiscono 
solo per il valore con e senza PreparedStatement...
Scusa per le prediche :)
Giorgio

Grazie Frate Giorg o Don Giorg come preferisci
grazie e buy rob
Giorgio Gallo <giorg...@RMVoverlord.it> wrote in message
c92rlg$6hs$1...@fata.cs.interbusiness.it...
