2016-03-30 1 views
2

Je travaille sur la base de données Oracle 11g Enterprises Edition. Nous devons obtenir les données des tables de base de données. tables de base de données ont un de ces types de colonnes:Pour obtenir la valeur de [email protected]

  • TIMESTAMPLTZ
  • timestamptz

Tous les autres types de données et leurs valeurs sont extraites avec succès.

Nous utilisons apache meta-modal pour analyser les tables de base de données et générer des fichiers CSV à l'aide de celles-ci.

Lorsque nous utilisons cette méthode sur les lignes:

row.getValues()[indexColumn] 

mais ce code ne va pas chercher la valeur de la colonne pour la ligne donnée, le retourner [email protected] objet sous forme de chaîne. Nous avons besoin de sa valeur.

Coulée à TIMESTAMPLTZ, à l'exception de la coulée. OU aussi columnValue.timestampValue() n'a aucun sens.

Comment puis-je obtenir la valeur du type de colonne TIMESTAMPLTZ en utilisant le méta-modèle Apache de manière formatée?

+0

Si vous pouvez déjà gérer d'autres types de données, ne pouvez-vous utiliser le [TIMESTAMPLTZ méthodes] (https://docs.oracle.com/database/121/JAJDB/oracle/sql/TIMESTAMPLTZ.html) pour convertir en une date etc. que vous pouvez ensuite formater pour le fichier CSV? Ou même en tant que chaîne si ce format est acceptable? –

Répondre

3

OK, donc si vous voyez quelque chose comme « [email protected] », dans votre sortie, votre code doit être appeler explicitement ou implicitement l'toString() sur un objet oracle.sql.TIMESTAMPLTZ.

Cela ne va pas vous donner quelque chose de lisible, et encore moins utile, car la classe TIMESTAMPLTZ ne remplace pas toString(). Ce que vous voyez est ce que la méthode par défaut Object.toString() vous donne.

Un TIMESTAMPLTZ est en fait un convertisseur/adaptateur de date qui enveloppe une date sous une certaine forme. La façon dont vous utilisez une instance TIMESTAMPLTZ consiste à appeler l'une des méthodes d'instance. Par exemple, l'appel dateValue(Connection) sur un objet TIMESTAMPLTZ convertira la date interne Oracle encapsulée dans un objet Date Java. Les autres méthodes d'instance sont converties en une chaîne, un tableau d'octets et des classes de date/heure JDBC.

(La classe a aussi un tas de méthodes de conversion statiques, mais je ne pense pas que ce que vous avez besoin ici.)

+0

Merci pour votre aide. Maintenant, je suis en mesure d'obtenir Date en utilisant dateValue, il est au format aaaa-MM-jj HH: mm: ss.SSS, mais la valeur conservée dans la base de données est de format différent, car je dois utiliser ce CSV pour restaurer ces valeurs une autre base de données d'Oracle. Au moment de la restauration, il renvoie erreur ORA-01843: pas un mois valide, en raison du format de la date. Je ne peux pas être sûr d'utiliser un format de date fixe dans SimpleDateFormat et ce n'est pas une bonne façon d'obtenir le format de date conservé dans oracle db pour enregistrer dans mon csv. –

+0

En fait, la date est stockée dans la base de données sous une forme binaire. Il semble que le problème actuel soit dans les conversions entre chaîne et binaire qu'Oracle fait. Consultez la documentation sur les modèles de format dans Oracle SQL: https://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements004.htm.Vous devriez être en mesure de tout faire fonctionner de manière cohérente si vous utilisez un SimpleDateFormat fixe et un modèle de date correspondant. –

+0

TIMESTAMPLTZ columnValue = (TIMESTAMPLTZ) row.getValues ​​() [pos]; Date date = columnValue.dateValue (connexion); String formatedDate = new SimpleDateFormat ("jj-MMM-aa hh.mm.ss.SSSSSSSSS a"). Format (date); .. columnValue.dateValue (connexion) it date de retour uniquement dans 16-02-2016 11:22: 06 jusqu'à secondes, mais dans mon DB il est jusqu'à microsecondes et fuseau horaire. Donc, le convertir dans mon format souhaitable ne produit pas de résultat correct. –