2016-03-30 14 views
2

Ich arbeite an Oracle 11g Enterprises Edition-Datenbank. Wir müssen die Daten aus den Datenbanktabellen holen. Datenbank-Tabellen haben eine dieser Arten von Spalten:Um den Wert von [email protected]

  • TIMESTAMPLTZ
  • TIMESTAMPTZ

Alle anderen Datentypen und deren Werte erfolgreich abgerufen werden.

Wir verwenden apache meta-modal, um die Datenbanktabellen zu analysieren und CSV zu erzeugen.

Wenn wir diese Methode auf Zeilen verwenden:

row.getValues()[indexColumn] 

aber dieser Code [email protected] Objekt als String nicht den Wert der Spalte für die gegebene Zeile holen, es zurückkehrt. Wir brauchen seinen Wert.

Casting zu TIMESTAMPLTZ, werfen Ausnahme der Besetzung. ODER auch columnValue.timestampValue() macht keinen Sinn.

Wie kann ich den Wert für Spaltentyp TIMESTAMPLTZ mit Apache-Metamodell in formatierter Form erhalten?

+0

Wenn Sie bereits andere Datentypen verarbeiten kann, können Sie nicht die [TIMESTAMPLTZ verwenden Methoden] (https://docs.oracle.com/database/121/JAJDB/oracle/sql/TIMESTAMPLTZ.html) um in ein Datum usw. zu konvertieren, das Sie dann für die CSV formatieren können? Oder sogar als String, wenn dieses Format akzeptabel ist? –

Antwort

3

OK, also wenn Sie so etwas wie „[email protected]“ sehen, in Ihrer Ausgabe dann müssen Sie den Code explizit oder implizit die toString() auf einem oracle.sql.TIMESTAMPLTZ Objekt aufgerufen werden.

Das wird Ihnen nichts lesbares geben, geschweige denn nützlich, weil die Klasse TIMESTAMPLTZtoString() nicht überschreibt. Was Sie sehen, ist, was die Standardmethode Object.toString() Ihnen gibt.

Ein TIMESTAMPLTZ ist eigentlich ein Datum Konverter/Adapter, der ein Datum in irgendeiner Form umschließt. Die Art, wie Sie eine TIMESTAMPLTZ-Instanz verwenden, besteht darin, eine der Instanzmethoden aufzurufen. Wenn Sie beispielsweise dateValue(Connection) auf einem Objekt TIMESTAMPLTZ aufrufen, wird das umbrochene interne Oracle-Datum in ein Java-Date-Objekt konvertiert. Andere Instanzmethoden werden in einen String, ein Byte-Array und JDBC-Datum/Uhrzeit-Klassen konvertiert.

(Die Klasse hat auch eine Reihe von statischen Wandler Methoden, aber ich glaube nicht, das ist, was Sie hier benötigen.)

+0

Danke für Hilfe. Jetzt kann ich Date mit dateValue erhalten, es ist im Format JJJJ-MM-TT HH: mm: ss.SSS, aber der Wert in der Datenbank hat ein anderes Format, da ich diese CSV verwenden muss, um diese Werte wiederherzustellen eine andere Datenbank von Orakel. Zum Zeitpunkt der Wiederherstellung gibt es einen Fehler von ORA-01843: wegen des Datumsformats kein gültiger Monat. Ich kann nicht sicher sein, ein fixes Datumsformat in SimpleDateFormat zu verwenden, und dies ist nicht der richtige Weg, um das Format des Datums, wie es in Oracle DB gespeichert ist, in meinem CSV zu speichern. –

+0

Eigentlich ist das Datum in der Datenbank in einer binären Form gespeichert. Es klingt wie das eigentliche Problem hier in den Konvertierungen zwischen String und Binär, dass Oracle tut. Sehen Sie sich die Dokumentation zu Formatmodelle in Oracle SQL an: https://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements004.htm.Sie sollten in der Lage sein, alles konsistent zu arbeiten, wenn Sie ein festes SimpleDateFormat und ein passendes Date Model verwenden. –

+0

TIMESTAMPLTZ columnValue = (TIMESTAMPLTZ) row.getValues ​​() [pos]; Date date = columnValue.dateValue (Verbindung); String formatiertDatum = neu SimpleDateFormat ("dd-MMM-yy hh.mm.ss.SSSSSSSSS a"). Format (Datum); .. columnValue.dateValue (Verbindung) Datum der Rückgabe nur am 16-02-2016 11:22: 06 bis Sekunden, aber in meinem db ist es bis Mikrosekunden und Zeitzone. Die Konvertierung in mein wünschenswertes Format führt also nicht zu einem korrekten Ergebnis. –

Verwandte Themen