Java JDBC Procedure Call
Domanda
Ho un procedimento oracolo che prende data come parametro e viene chiamato da due differenti applicazioni web Java, nell'ambito della procedura di estraggo il giorno usando to_char(date, 'd')
dalla data passata. Non sono in grado di scoprire perché il giorno restituito da un app è diverso da altri. Sto usando lo stesso driver ojdbc per entrambe le applicazioni. Ha qualcosa a che vedere con variabili macchina ENV queste applicazioni sono in esecuzione a?
Grazie
Soluzione
Prova a specificare esplicitamente il fuso orario su entrambi i contenitori webapp passando loro l'argomento -Duser.timezone="America/New_York"
VM (regolare secondo i vostri bisogni di fuso orario) quando li startingup.
Per risolvere il tuo commento, nel livello di applicazione è possibile specificare in modo esplicito il fuso orario desiderato quando si chiama il tuo proc memorizzato. Ad esempio:
CallableStatement statement = null;
Connection conn = null;
try {
conn = getYourConnection();
Calendar dbCal = new GregorianCalendar(YOUR_DATABASE_TIMEZONE);
String sql = "begin schema_name.package_name.stored_proc(var1=>?, " +
"var2=>?); end;";
statement = conn.prepareCall(sql);
statement.setInt(1, something);
statement.setTimestamp(2, yourDate.getTime(), dbCal);
statement.execute();
conn.commit();
} finally {
if (statement!=null) statement.close();
if (conn!=null) conn.close();
}
Altri suggerimenti
questo è perché il primo giorno della settimana non è la stessa in tutti i paesi, ad esempio in Europa il primo giorno della settimana è Lunedi mentre negli Stati Uniti è la Domenica. Prendere in considerazione:
SQL> select * from nls_session_parameters where parameter = 'NLS_TERRITORY';
PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_TERRITORY AMERICA
SQL> select to_char(date '2010-12-07', 'D') from dual;
TO_CHAR(DATE'2010-12-07','D')
-----------------------------
3
SQL> alter session set nls_territory=FRANCE;
Session altered
SQL> select to_char(date '2010-12-07', 'D') from dual;
TO_CHAR(DATE'2010-12-07','D')
-----------------------------
2
Impostare il parametro di sessione NLS_TERRITORY all'inizio della procedura, se dipende da esso.
provare a controllare il locale predefinito in JAVA / Oracle in entrambe le applicazioni.
Credo che possa dipendere dal set internazionale predefinita in JAVA.