2016-02-02 141 views
8

Oracle 11gデータベースで作成された表の行を表示するためにJDBCを使用しようとしていますが、問題は型の属性「SHAPE」の値を取得できませんそれは、テーブルの他の属性に来るときの方法によって正常に動作し、次のコードを使用して、「SDO_GEOMETRY」:SDO_GEOMETRY型の属性の値を表示

 try { 

      Class.forName("oracle.jdbc.driver.OracleDriver"); 
      System.out.println("Driver O.K."); 

      String url = "jdbc:oracle:thin:@localhost:1521:xe"; 
      String user = "system"; 
      String passwd = "isima"; 

      Connection conn = DriverManager.getConnection(url, user, passwd); 
      System.out.println("Connexion effective"); 

      Statement myStmt = null; 
      ResultSet myRs = null;   

      myStmt = conn.createStatement(); 

      myRs = myStmt.executeQuery("SELECT * FROM testGeo"); 

      while (myRs.next()) { 
      System.out.println(myRs.getString("shape")); 

      } 

      } catch (Exception e) { 
      e.printStackTrace(); 
      } 

をここではtestGeoテーブルといくつかのテストデータを作成するために使用されるDDL文です。

CREATE TABLE testGeo (
    GeoID NUMBER PRIMARY KEY, 
    name VARCHAR2(32), 
    shape SDO_GEOMETRY); 

INSERT INTO testGeo VALUES(
    1, 
    'cola_a', 
    SDO_GEOMETRY(
    2003, 
    NULL, 
    NULL, 
    SDO_ELEM_INFO_ARRAY(1,1003,3), 
    SDO_ORDINATE_ARRAY(1,1, 5,7) 
) 
); 

INSERT INTO testGeo VALUES(
    2, 
    'cola_b', 
    SDO_GEOMETRY(
    2003, 
    NULL, 
    NULL, 
    SDO_ELEM_INFO_ARRAY(1,1003,3), 
    SDO_ORDINATE_ARRAY(2,1, 6,7) 
) 
); 

INSERT INTO testGeo VALUES(
    3, 
    'cola_c', 
    SDO_GEOMETRY(
    2003, 
    NULL, 
    NULL, 
    SDO_ELEM_INFO_ARRAY(1,1003,3), 
    SDO_ORDINATE_ARRAY(1,1, 9,9) 
) 
); 
+0

'testGeo'テーブルといくつかのテストデータの作成に使用するDDL文を提供できますか? – MT0

+0

可能な複製http://stackoverflow.com/questions/7204200/how-to-retrieve-sdo-geometry-from-database-using-jdbc –

答えて

8

問題自体は、独自のマッピング・ライブラリで処理する必要があるカスタムOracleオブジェクトである複合オブジェクトを取得しようとしていることが原因です。あなたの例文で、ここで使用されるようなSDO_GEOMETRYタイプ:

SDO_GEOMETRY(
    2003, 
    NULL, 
    NULL, 
    SDO_ELEM_INFO_ARRAY(1,1003,3), 
    SDO_ORDINATE_ARRAY(1,1, 5,7) 
) 

は、Oracle Spatialのパッケージの一部であり、カスタムオブジェクトに依存しています。これらは、VARCHARまたはNUMBERのような基本的なSQLの列と同じくらい簡単に読み取ることはできません。そのため、getString("shape")呼び出しで結果が得られないのです。

Oracle SpatialののSQLタイプMDSYS.SDO_GEOMETRYをマップするJavaクラス:

ソリューションは、この目的のために正確に設計されたオラクルが提供するJGeometry packageを使用することです。 Oracle JDBCドライバのバージョン8.1.7以上のみをサポートします。 Oracle Spatial データベースでストロークされたジオメリへの基本アクセス機能を に提供します。あなたの図形オブジェクトを操作するためのカスタムJavaマッピングを使用することができるだろう、クラスパス上でこのライブラリを

/// reading a geometry from database 
ResultSet rs = statement.executeQuery("SELECT shape FROM testGeo"); 
STRUCT st = (oracle.sql.STRUCT) rs.getObject(1); 
//convert STRUCT into geometry 
JGeometry j_geom = JGeometry.load(st); 
+0

ありがとう、私はHibernateを使用して同じことをする方法を知っていますか? – Neo

+0

Hibernate 5はサポートされていません(しかし、私は推測します)。そうでなければ、HibernateチームのSpatialの正式なサポートがあります:http://www.hibernatespatial.org/。 –

3

あなたは

select g.geoid, g.name, go.column_value 
from testgeo g, table(g.shape.SDO_ORDINATES) go; 

のようなものを使用できますが、形状の各番号の1行を取得します。

+0

問題は実際には私が属性の値として "null"を取得することですSHAPE上記のようにJDBCを使用してデータベースにアクセスしようとすると、テーブルの各行の – Neo

2

SDO_GEOMETRYを文字列に変換できないため、エラーはgetString()と考えられます。私は正直言ってoracleDBについて知りませんので、それは単なる推測です。

getInt()またはgetByteArray()などのオプションを試しましたか?

データベースからデータを取得するときには、多くの可能性があります。

5

あなたはこのためにOracle SpatialのJavaパッケージにJGeometryクラスを使用する必要があります。あなたが戻ってデータベースにジオメトリを記述する必要がある場合は

// Read a geometry from the DB. 
ResultSet rs = statement.executeQuery("SELECT shape FROM testGeo where name='cola_a'"); 
STRUCT stGeo = (oracle.sql.STRUCT) rs.getObject(1); 
JGeometry jGeo = JGeometry.load(stGeo); 
// Use jGeo to fetch the required data. 

、あなたはこれを試すことができます:あなたは次のように、空間的なタイプを呼び出すことができます

// Write a geometry back to the DB. 
PreparedStatement ps = connection.prepareStatement("UPDATE testGeo set shape=? where name='cola_a'"); 
STRUCT stGeo = JGeometry.store(jGeom, connection); 
ps.setObject(1, stGeo); 
ps.execute(); 

注:の使用のためのJGeometryのマニュアルを参照してください。クラスAPI

関連する問題