如何使用 java.sql 包中的 rs.getSQLXML() 函数从 Oracle 数据库中获取 XMLType 列?

Posted

技术标签:

【中文标题】如何使用 java.sql 包中的 rs.getSQLXML() 函数从 Oracle 数据库中获取 XMLType 列?【英文标题】:How to get XMLType column from Oracle database using rs.getSQLXML() fuction from java.sql package? 【发布时间】:2019-06-29 21:31:19 【问题描述】:

当我尝试从 Oracle 数据库中获取 XMLType 列时,出现错误:

java.sql.SQLException: Invalid column type

问题出在rs.getSQLXML(1)函数中。

我的代码:

Connection conn = null;
String dbURL = "jdbc:oracle:thin:@localhost:1521:xe";
String user="user";
String pw = "pww";

try 
    Class.forName("oracle.jdbc.driver.OracleDriver");
    conn = DriverManager.getConnection(dbURL,user,pw);
 catch (Exception e) 
    System.out.println(e);


Statement stmt = null;
String query = "select e.doc from XMLTABLE e";
try 
    stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery(query);
    while (rs.next()) 
        SQLXML sqlxml = rs.getSQLXML(1);
        String xml1= sqlxml.getString();


        System.out.println(xml1);
    
 finally 
    if (stmt != null)  stmt.close(); 

我的数据库:

CREATE TABLE XMLTABLE (
    id NUMBER(4),
    doc XMLTYPE
);

我知道还有其他方法可以通过修改后的查询来获取 XMLType 列,例如 rs.getOPAQUE(1)rs.getCLOB(1)。但我需要使用 rs.getSQLXML(1) 函数。

我用的是ojdbc6版本。

编辑:

我尝试使用 ojdbc8 并调试了 ojdbc8 代码,结果如下:

            OPAQUE var2 = (OPAQUE)this.getOracleObject(var1);
            return var2 == null ? null : (SQLXML)var2;
         catch (ClassCastException var3) 
            throw (SQLException)((SQLException)DatabaseError.createSqlException(this.getConnectionDuringExceptionHandling(), 4).fillInStackTrace());
         

它返回 java.lang.ClassCastException: oracle.xdb.XMLType cannot be cast to java.sql.SQLXML 。这可能是一个问题。 我能用这个做什么?

【问题讨论】:

您是否尝试过升级到较新版本的 Oracle JDBC 驱动程序? ojdbc 不是一个版本:ojdbc6 表示它适用于 Java 6,而 ojdbc6 驱动程序的版本现在已经很老了。 我尝试使用 ojdbc7 和最新的 ojdbc8 并得到同样的错误。也许 rs.getSQLXML() 函数与 Oracle XMLType 不兼容,或者我需要在 sql 查询中做一些额外的更改? 【参考方案1】:

JDBC 驱动程序本身并不提供使用 JDBC XML API 所需的一切。

您需要其他库以及基本驱动程序 jar:xdb.jarxmlparserv.jar

xdb.jar可以在同一个地方下载as the base driver

xmlparserv.jar 应该是 somewhere in your Oracle installation。

【讨论】:

我的项目中已经有xdb.jarxmlparserv2.jar @wolukasz:你的类路径中也有 apache POI 库吗?我记得,如果两者同时使用会有一些问题

以上是关于如何使用 java.sql 包中的 rs.getSQLXML() 函数从 Oracle 数据库中获取 XMLType 列?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle日常性能查看

我如何将数据库添加到 netbean 项目的包中

Java里面的JDBC是啥意思啊?

java中常用的包类以及包中常用的类方法属性----sql和textswing

Java日期时间API系列35-----Jdk8中java.time包中的新的日期时间API类应用,微秒和纳秒等更精确的时间格式化和解析。

JavaJDBC编程