如何使用 simpleJdbcCall 在存储过程中获取 XML 输出参数
Posted
技术标签:
【中文标题】如何使用 simpleJdbcCall 在存储过程中获取 XML 输出参数【英文标题】:How to get the XML out parameter in a storedprocedure with simpleJdbcCall 【发布时间】:2019-07-19 14:55:00 【问题描述】:我有一个返回 XML 的过程,我正在使用 simpleJdbcCall 来执行它。当我以地图形式获得结果时,它返回一个 SQLServerSQLXML。我将它转换为 java.sql.SQLXML 以使用 getString() 方法但没有成功。它抛出一个 NegativeArraySize 异常。当我在 SQLServer Management Studio 中执行该过程时,它会工作并生成 XML。
我已经尝试获取二进制流但没有成功,它只返回了两个 unicode 字符:ÿ
(255) 和 þ
(254)。
这是我的 SimpleJdbcCall:
SimpleJdbcCall simpleCall = new SimpleJdbcCall(dataSource)
.withCatalogName("dbo")
.withProcedureName("pProcName")
.withoutProcedureColumnMetaDataAccess()
.declareParameters(new SqlParameter("@ID", Types.BIGINT))
.declareParameters(new SqlOutParameter("@XmlOut", Types.SQLXML));
我已经设置了 ID 并将其放在 MapSqlParameterSource 上,然后我执行该过程:
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("@ID", inDTO.getIdCertificado());
Map<String, Object> mapa = simpleCall.execute(params);
SQLXML xml = (SQLXML) mapa.get("@XmlOut");
String val = xml.getString();
【问题讨论】:
【参考方案1】:我可以开始使用输入流。似乎指针在末尾,所以我只需要重置它并将我的 xml 解析为文档:
InputStream binaryStream = xml.getBinaryStream();
binaryStream.reset();
DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document result = parser.parse(binaryStream);
然后使用它来获取我的属性和值。
【讨论】:
以上是关于如何使用 simpleJdbcCall 在存储过程中获取 XML 输出参数的主要内容,如果未能解决你的问题,请参考以下文章
使用simplejdbccall时如何在spring中关闭refcursor
SimpleJdbcCall 忽略 JdbcTemplate 获取大小