有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java显示SDO_GEOMETRY类型属性的值

我试图使用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)
  )
);

共 (2) 个答案

  1. # 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,它正是为此目的而设计的:

    A Java class that maps Oracle Spatial's SQL type MDSYS.SDO_GEOMETRY. Supports only Oracle JDBC Driver version 8.1.7 or higher. Provides basic access functions to the geomeries stroed in Oracle Spatial database.

    通过类路径上的这个库,您可以使用自定义Java映射来操作shape对象:

    /// 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);
    
  2. # 2 楼答案

    我认为错误在于getString(),因为SDO_几何体无法转换为字符串。老实说,我对oracleDB一无所知,所以这只是一个猜测

    你试过getInt()getByteArray()或类似的选择吗

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