Frage

Ich bin mit Oracle JDBC-Thin-Treiber (10.2.0.3) zu einer Oracle 10g-Datenbank zu verbinden. Ich möchte Informationen über die Datenbankspalten bekommen, so dass ich ResultSetMetaData . Die wichtigsten Informationen, die ich brauche, ist die Art der Säule und die Länge, so dass ich getColumnType , getPrecision und getScale Methoden.

Es funktioniert für eine einfache Abfrage (select * from tablename), wenn der Spalt Typ „einfachen“ wie VARCHAR2(50), NUMBER(5), NUMBER(6,2) ist. Wenn ich eine komplexere Abfrage (select count(*) from tablename) oder eine Abfrage basiert auf einer Ansicht haben, die einige komplexe Berechnung enthält, geben die Methoden seltsame Ergebnisse wie:

  • getScale: -127
  • beide getPrecision und getScale 0
  • getPrecision: -1

Einstellen der oracle.jdbc.J2EE13Compliant Verbindungseigenschaft true (wie von mehreren Seiten vorgeschlagen) eliminiert getScale = -127, aber immer noch gibt 0/0 Ergebnis.

Wahrscheinlich habe ich eine Abhilfe für diese seltsamen Ergebnisse zu schaffen, aber zuerst muß ich zumindest eine umfassende Dokumentation über das Verhalten von Oracle ResultSetMetaData. Zum Beispiel eine große Tabelle mit der Bedeutung von getPrecision / getScale für alle SQL-Typen wäre toll. Gibt es eine Dokumentation wie diese irgendwo?

War es hilfreich?

Lösung

Oracle kann nicht eine Art Rückkehr basiert auf einer Ansicht oder der count(*), da es nicht explizit erklärt wurde. Ihre Ansicht zurückkehren konnte jede Genauigkeit oder Skalierung in Abhängigkeit von den darunterliegenden Tabellen der Ansicht.

Um dies zu überwinden, müssten Sie den Typ in Ihrer Abfrage werfen oder wie folgt lesen:

select CAST (count(*) AS NUMBER(30))

Andere Tipps

Eine Alternative ist user_tab_columns oder all_tab_columns abzufragen.

eine Skala von 0 akzeptabel ist: eine Anzahl (5) das gleiche ist wie eine Anzahl (5,0)

Die Genauigkeit jedoch muss eine ganze Zahl zwischen 1 und 38 sein, wenn sie definiert ist. Wenn es nicht definiert ist, wie es an der Zahl, muss der Fahrer etwas zurück, da es nicht null zurückkehren kann. In diesem Fall wählt der Fahrer 0 zurückzukehren.

Es scheint mir, dass es auf ResultSetMetaData keine umfassende Dokumentation. Oracle® Database JDBC-Entwicklerhandbuch und Referenz 10g Release 2 ( 10.2) und 11g Release 2 (11.2 ) gibt Beispiel über Spaltennamen und Typen ein ähnliches Problem mit PostgreSQL vor einigen Jahren, und er machte einen Patch. Vielleicht Oracle verwendet die gleiche Code-Basis hier.

Sie können versuchen, die ojdbc14 verwenden _g .jar statt ojdbc14.jar als Klassen mit „javac -g“ zusammengestellt wurden und einige Tracing-Informationen enthalten.

Sie können auch versuchen, neuere Treiber .

Sie können die rs.getBigDecimal(columnIndex) verwenden und von der großen dezimal können Sie die Präzision / Skalenwerte der spezifischen Spalten erhalten.

Nicht eine direkte Antwort auf Ihre Frage, aber eine Abhilfe Sie erwähnt:

Wenn alles, was Sie tun müssen, ist zu überprüfen oder db-Schemas vergleichen, dann statt ResultSetMetaData und Abfrage alle Tabellen verwenden Oracle-Schema-Informationen, wie in der Reverse Engineering ein Datenmodell . Ich habe es in meinem Dienstprogramm solche Informationen Text

Für den Export
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top