In Oracle, perché a volte CURRENT_TIMESTAMP tornare ora del server, altre volte GMT?
Domanda
Ho un'applicazione Java in esecuzione in un database Oracle 9i. Il database ha un trigger per creare un record di controllo, che tiene traccia delle modifiche al record di base. Il trigger utilizza CURRENT_TIMESTAMP. Quando ho modificare il record di base con l'applicazione Java, il record di controllo riflette GMT. Tuttavia, se uso Toad e aggiornare il record di base, il record di controllo riflette ora del server (che è impostato per l'ora locale). Interrogazione CURRENT_TIMESTAMP restituisce ora del server. Io non riesco a trovare ciò che provoca la differenza. Tutte le idee là fuori?
Soluzione
i valori dei parametri NLS possono essere impostati all'interno di una sessione (a volte in un trigger di accesso), ereditato dall'ambiente operativo, o impostare in caso di avvio, che li rende un po 'difficile rintracciare.
La query seguente mostra divergenza dal database, e se è possibile ottenere questo output dai due ambienti divergenti, può aiutare:
SELECT * FROM
(
SELECT PARAMETER,
VALUE AS SESSION_VALUE,
(SELECT VALUE FROM NLS_INSTANCE_PARAMETERS NIP
WHERE NIP.PARAMETER = NSP.PARAMETER) INSTANCE_VALUE,
(SELECT VALUE FROM NLS_DATABASE_PARAMETERS NDP
WHERE NDP.PARAMETER = NSP.PARAMETER) DATABASE_VALUE
FROM NLS_SESSION_PARAMETERS NSP
)
WHERE NVL(INSTANCE_VALUE, DATABASE_VALUE) <> DATABASE_VALUE
OR NVL(SESSION_VALUE, NVL(INSTANCE_VALUE, DATABASE_VALUE)) <> DATABASE_VALUE
Quando ho eseguito che in un sistema Windows SQL * Plus, ho avuto nessun righe restituite, quindi non ci sono state differenze tra il mio ambiente applicativo e là valori predefiniti del database. Tuttavia, quando ho eseguito da un ambiente Unix:
PARAMETER SESSION_VALUE INSTANCE_VALUE DATABASE_VALUE
------------------------- ------------------------- ------------------------- -------------------------
NLS_DATE_FORMAT YYYY-MM-DD HH24:MI:SS DD-MON-RR
NLS_TIMESTAMP_TZ_FORMAT YYYY-MM-DD HH24:MI:SS.FF DD-MON-RR HH.MI.SSXFF AM
TZH:TZM TZR