Oracle结果集中XMLType无法获取,程序无报错退出
问题
我通过查询生成XMLElement,输出类型为SYS.XMLType。按照Oracle官方文档的方式转换并获取该类型数据时,程序直接退出且无任何报错。
相关Java代码
dppSummaryps = (OraclePreparedStatement) connDb.prepareStatement(dppSummary); System.out.println("Prepared Statement before bind variables set:\n\t" + dppSummaryps.toString()); dppSummaryps.setString(1, readTimeStart); dppSummaryps.setString(2, readTimeEnd); // System.out.println("uwjdpps.dppSummary() " + dppSummaryps.toString()); ResultSet rs = dppSummaryps.executeQuery(); OracleResultSet ors = (OracleResultSet) rs; ResultSetMetaData mdata = rs.getMetaData(); if (mdata.getColumnType(1) == OracleTypes.OPAQUE && mdata.getColumnTypeName(1).compareTo("SYS.XMLTYPE") == 0) { // we know it is an XMLtype System.out.println("YEAH XMLTYPE: Column name = " + mdata.getColumnTypeName(1)); } while (ors.next()) { // get the XMLType OPAQUE poxml = ors.getOPAQUE("XML"); XMLType xmltype = (XMLType) poxml; // get the XML as a string... System.out.println(xmltype); // xml = (XMLType) rs.getObject(1); // dppSummaryType = rs.getString("XML"); String result = IOUtils.toString(poxml.getStream()); System.out.println(result); try { File targetFile = new File(FILE_PATH_XML + "test.xml"); // OutputStream outStream = new OutputStream(targetFile); // outStream.write(result); // IOUtils.closeQuietly(outStream); } catch (Exception e) { String err = e.toString(); System.out.println(err); } }
排查与修复建议
- 捕获全局异常:当前代码仅在文件写入块处理异常,
getOPAQUE、类型强转、流操作等步骤可能抛出未被捕获的运行时异常,直接导致程序退出。把整个while循环包裹在try-catch中,打印完整堆栈:
try { while (ors.next()) { // 原循环内代码 } } catch (Exception e) { e.printStackTrace(); }
- 修正XMLType转换逻辑:不要直接将
OPAQUE强转为XMLType,使用官方推荐的工厂方法:
// 从OPAQUE创建XMLType XMLType xmltype = XMLType.createXML(poxml); // 或直接从ResultSet获取 XMLType xmltype = (XMLType) ors.getObject("XML");
- 正确处理资源流:
poxml.getStream()返回的输入流未关闭,可能引发资源泄漏。用try-with-resources自动管理流:
try (InputStream stream = poxml.getStream()) { String result = IOUtils.toString(stream); System.out.println(result); } catch (IOException e) { e.printStackTrace(); }
- 检查驱动兼容性:确保Oracle JDBC驱动版本与数据库版本匹配,旧驱动对XMLType的处理可能存在bug,建议升级到对应数据库版本的最新驱动。
内容的提问来源于stack exchange,提问作者Digant Jani
相关产品推荐
相关产品推荐

