Ich versuche, JDBC zu verwenden, um Zeilen in einer Tabelle anzuzeigen, die in einer Oracle 11g-Datenbank erstellt wird. Das Problem ist, dass es mir nicht gelingt, den Wert des Attributs "SHAPE" vom Typ "SDO_GEOMETRY" mithilfe des folgenden Codes zu ermitteln , was übrigens gut funktioniert, wenn es um die anderen Attribute der Tabelle geht:
%Vor%Hier sind die DDL-Anweisungen, die zum Erstellen der testGeo-Tabelle und einiger Testdaten verwendet werden.
%Vor% Das Problem selbst wird durch die Tatsache verursacht, dass Sie versuchen, ein komplexes Objekt, das ein benutzerdefiniertes Oracle-Objekt ist, mit einer eigenen Zuordnungsbibliothek abzurufen. Der SDO_GEOMETRY
-Typ wie verwendet Hier in Ihrer Beispielanweisung:
ist Teil des Oracle Spatial-Pakets und basiert auf benutzerdefinierten Objekten. Diese können nicht so einfach gelesen werden wie grundlegende SQL-Spalten wie VARCHAR
oder NUMBER
, weshalb Ihr Aufruf getString("shape")
keine Ergebnisse liefert.
Die Lösung besteht darin, das von Oracle bereitgestellte JGeometry-Paket zu verwenden genau für diesen Zweck entworfen:
Eine Java-Klasse, die den Oracle-Spatial-SQL-Typ MDSYS.SDO_GEOMETRY abbildet. Unterstützt nur Oracle JDBC Driver Version 8.1.7 oder höher. Bietet grundlegende Zugangsfunktionen zu den in Oracle Spatial verwendeten Geomerien Datenbank.
Mit dieser Bibliothek auf Klassenpfad können Sie die benutzerdefinierten Java-Mappings verwenden, um Ihr Shape-Objekt zu bearbeiten:
%Vor%Sie sollten die JGeometry Klasse in der Oracle Spatial Java-Paket dafür. Sie können den räumlichen Typ wie folgt aufrufen:
%Vor%Wenn Sie die Geometrie wieder in die Datenbank schreiben müssen, können Sie Folgendes versuchen:
%Vor%Hinweis: Informationen zur Verwendung der Klassen-APIs finden Sie in der JGeometry-Dokumentation.
Sie können etwas wie
verwenden %Vor%Sie erhalten jedoch eine Zeile für jede Zahl in der Form.
Ich glaube, der Fehler liegt bei getString()
, weil SDO_GEOMETRY nicht in eine Zeichenfolge umgewandelt werden kann. Ich habe keine Kenntnisse von OracleDec, um ehrlich zu sein, also ist es nur eine Vermutung.
Haben Sie getInt()
oder getByteArray()
oder ähnliche Optionen probiert?
Beim Abrufen von Daten aus der Datenbank gibt es viele Möglichkeiten.