如何使用 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 找不到存储过程

使用simplejdbccall时如何在spring中关闭refcursor

SimpleJdbcCall 忽略 JdbcTemplate 获取大小

SimpleJDBCCall 类参数传递

Spring SimpleJdbcCall 默认(可选)参数

如何在Spring中调用存储过程来读取返回值和输出参数?