2010-09-02 9 views
2
CREATE TABLE DIALOGUE_TABLE(EXPIRE_TIME TIMESTAMP); 

extrait de code suivant est stocké à l'intérieur proc:Oracle Horodatage format de l'heure UTC

PO_EXPIRETIME :- OUT PARAM of procedure a varchar2 

SELECT TO_CHAR(SYS_EXTRACT_UTC(EXPIRE_TIME)) 
    INTO PO_EXPIRETIME 
    FROM DIALOGUE_TABLE; 

Quand je lance stored proc à partir du serveur en utilisant EXEC et impression horodatage PO_EXPIRETIME est propre au format UTC.

Mais lorsque j'appelle la procédure stockée de et le client l'horodateur reçu n'est pas le même mais c'est l'horodatage réel dans la table non formaté UTC.

Peut-être que quelque chose me manque mais que sais-je? Y a-t-il quelque chose du côté client que je dois faire?

Répondre

5

Si la colonne est déclarée TIMESTAMP et non pas, par exemple, TIMESTAMP WITH TIME ZONE ou TIMESTAMP WITH LOCAL TIME ZONE, l'horodatage stocké dans la table n'aura pas de composant de fuseau horaire. Par conséquent, SYS_EXTRACT_UTC convertira l'horodatage en UTC en utilisant le fuseau horaire de la session, qui est contrôlé par le client et peut être différent sur différentes machines client. Je pense que si vous exécutez

SELECT SessionTimeZone 
    FROM dual; 

de votre application CICO et de votre session SQL * Plus que vous finirez avec des résultats différents qui est à l'origine des chaînes renvoyées à être différent.

Si vous voulez que la chaîne renvoyée soit indépendante de la machine cliente, je suggérerais de stocker le fuseau horaire dans la colonne de la base de données. Est-ce que changer la définition du schéma pour utiliser une option TIMESTAMP WITH TIME ZONE? Sauf que, vous pouvez faire en sorte que chaque machine client a le même fuseau horaire configuré et/ou exécuter une session explicite ALTER, à savoir

ALTER SESSION 
    SET time_zone = '-05:00'; 

dans la procédure stockée pour faire en sorte que la conversion se fait toujours à partir d'une zone horaire particulier .

+0

- merci Justin.qui a résolu mon problème. –