ResultSet liefert oracle.sql.TIMESTAMP, aber unbrauchbar

Status
Nicht offen für weitere Antworten.
R

Rock Lobster

Gast
Hallo,

ich lese eine Datenbank aus, um die Daten in einem XML-File zu speichern und sie später wieder importieren zu können.

Allerdings habe ich Probleme bei Datums-Werten. Und zwar bekomme ich laut ResultSetMetaData den Typ oracle.sql.TIMESTAMP, aber wenn ich dann vom ResultSet getString() aufrufe, bekomme ich einen Datums-String, der nicht korrekt formatiert ist - mit dem Effekt, daß ich keinen neuen oracle.sql.TIMESTAMP damit instanzieren kann (also wenn ich versuche, den String dem Konstruktor zu übergeben).

Hier ein Beispiel für den String, den ich bekomme:
Code:
 2006-12-19.16.29. 8. 144000000

Ich kann zwar irgendwie rauslesen, daß es sich um den 2006-12-19 handelt und die Uhrzeit 16:29 und 8,144 Sekunden ist, aber der konstruktor vom TIMESTAMP erwartet folgendes Format:
Code:
 Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]

Naja, jetzt ist halt die Frage, warum liefert das ResultSet einen String in einem äußerst unglücklichen Format, das ich später nicht wieder weiterverwenden kann?
Als Lösung fällt mir ein, entweder den Typ abzufragen und dementsprechend zu handeln (z.B. ein Date davon getten statt einem String, oder direkt den Long des Timestamps zu getten), aber das würde ich gerne nur als Notlösung in Erwägung ziehen. Mir wäre es lieber, ich würde das auf "sauberem" Wege kriegen, und eigentlich müßte der String mir doch das korrekte Format liefern.

Weiß jemand, an was das liegt? Und gibt es vielleicht eine bessere Lösung, als die von mir vorgeschlagene?
 
R

Rock Lobster

Gast
Ja klar, das wäre eine Lösung (wie bereits auch erwähnt).

Allerdings will ich nicht extra unterscheiden, mit welchem Wert ich es zu tun habe, sondern ich will jeden Wert als String auslesen, da das ja dann in ein XML-File geschrieben wird. Und es funktioniert ja auch perfekt, nur beim Timestamp kommt er mit so 'nem komischen Format. Dabei wär's mir halt eigentlich lieber, da nicht extra noch den Typ überprüfen zu müssen und je nach dem dann entscheiden, ob ich getString() oder getTimestamp() aufrufen soll.

Ich weiß, codemäßig sind das nur 2 Zeilen, aber irgendwie gefällt mir der Ansatz halt nicht (vor allem halt auch weil es mich einfach nur wundert, wieso getString() in dem Fall so ein ungewöhnliches (und irgendwie falsch aussehendes) Format liefert).
 

abollm

Top Contributor
Wenn du schon Oracle nutzt, warum benutzt du nicht gleich die Konvertierfunktion "to_char"?

Damit kannst du die Werte von DATE-Spalten nach Wunsch formiert ausgeben.

Das geht z.B. so:

Code:
[..]
	static String query = "SELECT a.empno, a.ename, a.job, "
			+ "a.mgr, to_char(a.hiredate, 'DD.MM.YYYY HH24:MM:SS'), a.sal, a.comm, a.deptno  FROM emp a";

	[..]
	// Connect to the database
	Connection conn = DriverManager.getConnection(url, user, passw);

	Statement stmt = conn.createStatement();
	// Query absetzen
	ResultSet rs = stmt.executeQuery(query);
	// Query verarbeiten …
	System.out.println("Ausgabe Datensätze\n");
	while (rs.next()) {
[..]

Beachte den String "query" oben!
Im Grunde kannst du mit dieser Methode auch die Parameter für NLS_DATE_LANGUAGE beliebig setzen.
 
R

Rock Lobster

Gast
Naja, ich lese nicht einzelne Werte aus, sondern mache "SELECT *", und zwar aus dem Grund, weil ich die gesamte Tabelle als XML exportieren möchte, unabhängig davon, wie sie aufgebaut ist. Daher habe ich ja dann auch ResultSet - getString() benutzt, weil mir das immer die perfekte String-Repräsentation liefert, egal welcher Datentyp. Nur beim Datum schlägt das leider fehl, und mir ist einfach nicht klar, warum, denn es wird ja tatsächlich ein korrektes Datum geliefert usw, nur das Format paßt halt nicht.
 
G

Guest

Gast
Gäähhn, mir ist langweilig :wink:
Code:
public final class ResultSetReader {
   private static final Format dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm");
   private ResultSet resultSet;
   private Map<Integer,Integer> fieldMap;

   public ResultSetReader(ResultSet resultSet) throws SQLException {
      this.resultSet = resultSet;
      ResultSetMetaData metaData = resultSet.getMetaData();
      Map<String,Integer> fieldMap = new HashMap<String,Integer>(metaData.getColumnCount()+1, 1.0f);
      for(int i=1, n=metaData.getColumnCount(); i<=n; i++)
         fieldMap.put(i, metaData.getColumnType(i));
   }

   public boolean next() {
      return resultSet.next();
   }

   public int getColumnCount() {
      return fieldMap.size();
   }

   public String getStringValue(int index) throws SQLException {
      assert index >= 1 && index <= fieldMap.size() : "Field index out of range ("+index+")";
      Integer valueType = fieldMap.get(index);
      String result = null;
      if(Types.TIMESTAMP != valueType.intValue()) {
         String stringValue = resultSet.getString(index);
         if(!resultSet.wasNull())
            result = stringValue;
      }
      else {
         Timestamp timestampValue = resultSet.getTimestamp(index);
         if(!resultSet.wasNull())
            result = dateFormat.format(timestampValue);
      }
      return result;
   }
}
Anwendung
Code:
...
ResultSet resultSet = null;
try {
   ...
   ResultSetReader reader = new ResultSetReader(resultSet);

   int columnCount = reader.getColumnCount();
   while(reader.next()) {
      for(int i=1; i<=columnCount; i++) {
         String stringValue = reader.getStringValue(i);
         ...
      }
   }
}
finally {
   if(null != resultSet)
      resultSet.close();
   ...
}
 
G

Guest

Gast
Kleine Korrektur
Code:
Map<Integer,Integer> fieldMap = new HashMap<Integer,Integer>(metaData.getColumnCount()+1, 1.0f);
 

abollm

Top Contributor
Rock Lobster hat gesagt.:
Naja, ich lese nicht einzelne Werte aus, sondern mache "SELECT *", und zwar aus dem Grund, weil ich die gesamte Tabelle als XML exportieren möchte, unabhängig davon, wie sie aufgebaut ist. Daher habe ich ja dann auch ResultSet - getString() benutzt, weil mir das immer die perfekte String-Repräsentation liefert, egal welcher Datentyp. Nur beim Datum schlägt das leider fehl, und mir ist einfach nicht klar, warum, denn es wird ja tatsächlich ein korrektes Datum geliefert usw, nur das Format paßt halt nicht.

Welche Oracle-Version hast du auf deinem DB-Server am laufen?

Ab Oracle 10.1 kannst du beispielsweise die erweiterten XML-Möglichkeiten des Oracle-RDBMS bequem nutzen.
 

abollm

Top Contributor
Rock Lobster hat gesagt.:
Naja, ich lese nicht einzelne Werte aus, sondern mache "SELECT *", und zwar aus dem Grund, weil ich die gesamte Tabelle als XML exportieren möchte, unabhängig davon, wie sie aufgebaut ist. Daher habe ich ja dann auch ResultSet - getString() benutzt, weil mir das immer die perfekte String-Repräsentation liefert, egal welcher Datentyp. Nur beim Datum schlägt das leider fehl, und mir ist einfach nicht klar, warum, denn es wird ja tatsächlich ein korrektes Datum geliefert usw, nur das Format paßt halt nicht.

Na ja, mir ist zwar nicht langweilig, aber hier einmal ein motivierendes Beispiel, das ab Oracle 9i lauffähig ist. Es basiert auf den installierten XSU-Klassen. Das dürfte dein Problem vollständig lösen.
Code:
package ora.xml;

import java.sql.*;
import oracle.xml.sql.query.*;

public class XMLOracleSample
{

  // Hier geht es los ...
  public static void main(String args[]) throws SQLException
  {

    String tabName = "emp";
    String user = "scott/tiger";

    DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());

    // Initialisiere JDBC-Verbindung (mit native Oracle-Treiber OCI
    Connection conn = 
      DriverManager.getConnection("jdbc:oracle:oci8:"+user+"@allfatst");

    // Erzeuge SQL-Statement und führe es aus, um ResultSet zu erhalten
    Statement stmt = conn.createStatement();
    ResultSet rset = stmt.executeQuery("select * from "+tabName );
    
    // Initialisiere OracleXMLQuery; Hinweis: Man kann auch die SQL-Query anstatt
    // ResultSet übergeben
    OracleXMLQuery qry =  new OracleXMLQuery(conn,rset);
    
    // Datumsformat für Datenfelder setzen
    qry.setDateFormat("dd.MM.yyyy HH:mm:ss");

    // XML-Dokument im String-Format
    String xmlString = qry.getXMLString();
    
    // Ausgabe auf Konsole
    System.out.println("XML-Ausgabe:\n"+xmlString); 
  }

Merke: Oracle bietet allein mit den gelieferten Bordmitteln eine erhebliche Menge an Möglichkeiten für die Verarbeitung von XML-Daten!

Hth
 
R

Rock Lobster

Gast
Okay, danke für eure Antworten!

Mir persönlich gefällt die Version mit dem "ResultSetReader" besser, naja da hätt ich eigentlich auch selbst draufkommen können :D

Die andere Möglichkeit ist natürlich auch gut, aber ich will eigentlich nicht allzu speziell auf den Typ der Datenbank eingehen. Natürlich glaube ich nicht, daß wir irgendwann von Oracle (9i) auf was anderes umstellen, aber irgendwie möchte ich den Code halt relativ unabhängig halten, und im Moment kann ich ihn halt für jede Datenbank einsetzen, die ich will.

Werde es jetzt also wohl so wie in Möglichkeit 1 handhaben.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S ResultSet als Parameter an andere Klasse übergeben Datenbankprogrammierung 3
Z ResultSet ist null warum? Datenbankprogrammierung 12
R HSQLDB ResultSet update aktualisiert DB, aber nicht das ResultSet Datenbankprogrammierung 2
Dimax Erstellen ResultSet und Statement Datenbankprogrammierung 30
C PostgreSQL ResultSet.TYPE_SCROLL_SENSITIVE setzen Datenbankprogrammierung 2
L MySQL Bekomme einen Fehler beim ResultSet Datenbankprogrammierung 12
L Zugriff auf ein Resultset Datenbankprogrammierung 7
L MySQL ResultSet vollständig auslesen Datenbankprogrammierung 20
D Resultset schließen ?? Datenbankprogrammierung 5
T Oracle Resultset to Array sehr langsam. Datenbankprogrammierung 8
B Probleme mit java.sql.SQLException: ResultSet closed Datenbankprogrammierung 21
J SQLite ResultSet closed -- Wiederholende DB-Abfragen Datenbankprogrammierung 6
Z MySQL Probleme mit resultSet executQuery Datenbankprogrammierung 3
L ResultSet Datenbankprogrammierung 1
J wie mit resultset.next() über Datensätze iterieren? Datenbankprogrammierung 15
R MySQL Umgang mit ResultSet/Fremdschlüssel ausgeben Datenbankprogrammierung 2
D MySQL ResultSet als Stream weiter geben Datenbankprogrammierung 9
M ResultSet Cachen Datenbankprogrammierung 3
R ResultSet mit "Untertabellen" Datenbankprogrammierung 4
N SQL-Statement Auslesen des Resultset wird immer langsamer Datenbankprogrammierung 6
R Resultset.last() Problem Datenbankprogrammierung 12
PaulG Leeres ResultSet initialisieren Datenbankprogrammierung 6
J Frage zu ResultSet Datenbankprogrammierung 3
J SQL ResultSet Previous Datenbankprogrammierung 10
S MySQL ResultSet in ein Array übertragen Datenbankprogrammierung 7
H PostgreSQL Objekte aus ResultSet Datenbankprogrammierung 5
H ResultSet is closed tritt bei JSF aber nicht bei einer Java-Applikation auf Datenbankprogrammierung 10
O Oracle Resultset greift auf Spaltenüberschriften zu Datenbankprogrammierung 2
Kenan89 Wieso klappt das ResultSet nicht? Datenbankprogrammierung 3
C ResultSet enthält nicht alle Daten Datenbankprogrammierung 4
F Derby/JavaDB Resultset in JTablemodel Datenbankprogrammierung 2
F Oracle ResultSet zu einer HashMap<Integer, String[]> Datenbankprogrammierung 6
B SQLite ResultSet is TYPE_FORWARD_ONLY Datenbankprogrammierung 5
T Exception ResultSet Datenbankprogrammierung 7
0 ResultSet in JTable Datenbankprogrammierung 14
S [SQL] ResultSet Datenbankprogrammierung 4
R ResultSet Datenbankprogrammierung 4
I Sonderbehandlung wenn ResultSet leer ist Datenbankprogrammierung 9
I Problem mit ResultSet Datenbankprogrammierung 2
I SQL_Abfrage-Ergebnis (ResultSet) in String[] speichern Datenbankprogrammierung 29
B ResultSet wirft komische NullPointerException. Datenbankprogrammierung 3
R Detached ResultSet Datenbankprogrammierung 3
F generelle Vorgehensweise ResultSet Datenbankprogrammierung 5
S ResultSet Datenbankprogrammierung 2
A MySQL ResultSet.updateBytes schlägt fehl Datenbankprogrammierung 2
F ResultSet kann Datenbank nicht update, warum? Datenbankprogrammierung 3
T ResultSet befehl für leere Spalte nicht lesen Datenbankprogrammierung 4
S ResultSet einer Datenbankabfrage - Nullpointer Exception Datenbankprogrammierung 13
A PostgreSQL anfängerfrage: resultset zeilenweise auslesen Datenbankprogrammierung 2
T MySQL ResultSet zurückgeben nachdem Connection geschlossen wurde? Datenbankprogrammierung 3
K Keine ResultSet bei if in StoredProcedure Datenbankprogrammierung 16
D ResultSet gibt nichts aus. Datenbankprogrammierung 3
trash ResultSet Syntax Fehler Datenbankprogrammierung 11
ARadauer JDBC ResultSet schließen? Datenbankprogrammierung 4
M Oracle Problem mit Resultset Datenbankprogrammierung 11
J jdbc ResultSet types Datenbankprogrammierung 5
R Frage zu PreparedStatement/ResultSet Datenbankprogrammierung 16
F ResultSet to String[] Datenbankprogrammierung 3
E ResultSet in HashMap Datenbankprogrammierung 8
K Tabelle mit resultset refreshen? Datenbankprogrammierung 4
M Problem mit ResultSet bei SQL Server 2005 Datenbankprogrammierung 6
S ResultSet in ArrayList ablegen Datenbankprogrammierung 17
G Daten aus ResultSet in String-Liste Datenbankprogrammierung 13
T ResultSet initialisieren Datenbankprogrammierung 2
C kein Resultset Datenbankprogrammierung 2
G ResultSet: String mit Anführungszeichen einlesen Datenbankprogrammierung 8
T ResultSet-Inhalt in Arrays schreiben Datenbankprogrammierung 3
S ResultSet variabel auslesen Datenbankprogrammierung 4
D Anzahl der Elemente im ResultSet ermitteln Datenbankprogrammierung 8
A Leeres ResultSet mit H2 unter Vista Datenbankprogrammierung 3
A Warum ist mein ResultSet leer? Datenbankprogrammierung 5
S ResultSet closed Datenbankprogrammierung 2
Z ResultSet mit einer anderen Datenquelle Datenbankprogrammierung 7
O Spaltenname aus Resultset Datenbankprogrammierung 2
thE_29 ResultSet und doppelte Spalten Datenbankprogrammierung 4
E Neues select auf ein vorhandenes Resultset Datenbankprogrammierung 11
E ResultSet vergisst Reihe? Datenbankprogrammierung 2
N resultset aus andere klasse übergeben Datenbankprogrammierung 3
F ResultSet refresh moeglich? Datenbankprogrammierung 3
S ResultSet enthält keine Daten Datenbankprogrammierung 2
B Geschlossenes ResultSet Datenbankprogrammierung 6
T ResultSet#next Ungültige Reihenfolge (DB2) Datenbankprogrammierung 5
T ResultSet schließen? Datenbankprogrammierung 6
S Tabelle updaten wenn ResultSet aus JDBC-Quelle Datenbankprogrammierung 2
S ResultSet Datenbankprogrammierung 6
F Filtern innerhalb eines Resultset Datenbankprogrammierung 12
S Connection/Statement/ResultSet auf einmal geschlossen Datenbankprogrammierung 8
@ Like-Klausel; NPE bzw. leeres ResultSet Datenbankprogrammierung 4
C Resultset nach connection close weiterreichen Datenbankprogrammierung 5
B No ResultSet was produced Datenbankprogrammierung 2
S ResultSet erweitern ? Datenbankprogrammierung 4
E JDBC, ForwardOnly bei ResultSet nach Uebergabe Datenbankprogrammierung 4
A Probleme mit ResultSet und getString(i) Datenbankprogrammierung 13
RaoulDuke ResultSet - Wie arbeitet sowas intern Datenbankprogrammierung 2
N Probleme mit "nur vorwärts gerichtete ResultSet" Datenbankprogrammierung 7
G Für jede SQL-Abfrage eigenes Statement und ResultSet? Datenbankprogrammierung 3
T MAX und ResultSet#next Datenbankprogrammierung 10
R ResultSet zu bestimmtem DS navigieren Datenbankprogrammierung 4
S .leeres Resultset abfangen Datenbankprogrammierung 2
B ResultSet ohne Datenbank erstellen Datenbankprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben