【问题标题】:Display value of attribute of type SDO_GEOMETRY显示 SDO_GEOMETRY 类型的属性值
【发布时间】:2016-02-02 11:12:09
【问题描述】:

我正在尝试使用 JDBC 显示在 Oracle 11g 数据库中创建的表中的行,问题是我无法使用以下代码获取类型为“SDO_GEOMETRY”的属性“SHAPE”的值,顺便说一下,当涉及到表的其他属性时,它可以正常工作:

        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)
  )
);

【问题讨论】:

标签: java sql oracle oracle11g


【解决方案1】:

问题本身是由于您试图检索一个复杂的对象引起的,该对象是一个自定义 Oracle 对象,应该使用它自己的映射库来处理。使用的 SDO_GEOMETRY 类型在你的示例语句中:

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

是 Oracle Spatial 包的一部分,依赖于自定义对象。这些不能像VARCHARNUMBER 这样的基本SQL 列那样容易读取,这就是为什么您的getString("shape") 调用不会产生任何结果。

解决方案是使用专门为此目的设计的 Oracle 提供的JGeometry package

映射 Oracle Spatial 的 SQL 类型 MDSYS.SDO_GEOMETRY 的 Java 类。 仅支持 Oracle JDBC Driver 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);

【讨论】:

  • 谢谢,你知道我如何使用 Hibernate 做同样的事情吗?
  • 不支持 Hibernate 5(我猜是目前),但 Hibernate 团队对 Spatial 提供了官方支持:hibernatespatial.org
【解决方案2】:

您应该为此使用 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 的用法。

【讨论】:

    【解决方案3】:

    你可以使用类似的东西

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

    但是你会为形状中的每个数字得到一行。

    【讨论】:

    • 问题实际上是当我尝试使用 JDBC 访问我的数据库时,我得到“null”作为表的每一行的属性 SHAPE 的值,如上所示。
    【解决方案4】:

    我相信错误在于getString(),因为 SDO_GEOMETRY 无法转换为字符串。老实说我对oracleDB一无所知,所以只是猜测。

    您是否尝试过getInt()getByteArray() 或类似选项?

    从数据库中获取数据有很多可能性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-01
      • 2019-02-20
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      • 2019-03-26
      相关资源
      最近更新 更多