首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Spring的存储过程使用XML作为Oracle的输入参数需要配置哪些设置

使用Spring的存储过程使用XML作为Oracle的输入参数需要配置哪些设置
EN

Stack Overflow用户
提问于 2015-01-22 10:07:00
回答 1查看 3.1K关注 0票数 2

我有一个spring应用程序,它需要使用XML参数执行存储过程。存储过程声明如下:

代码语言:javascript
运行
复制
private class InsertXMLDataProcedure extends StoredProcedure {

    public InsertXMLDataProcedure(DataSource ds) {
        super(ds, PROCEDURE_NAME);
        declareParameter(new SqlParameter("COMPANYNO", Types.INTEGER));
        declareParameter(new SqlParameter("XMLDATA", Types.SQLXML));
        declareParameter(new SqlParameter("ERRORNO", Types.INTEGER));
        declareParameter(new SqlParameter("ERRORDESC", Types.VARCHAR));
        compile();
    }

    public Map<String, Object> execute(int companyNumber, String xmlData, int errorNumber, String errorDescription) {
        return super.execute(companyNumber, xmlData, errorNumber, errorDescription);
    }
}

但是,XML输入没有插入到表中。显然,Oracle需要特定于供应商的配置设置来识别输入。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-23 09:35:59

好的,所以修复这是一个小的依赖令人厌恶,因为Oracle的拜占庭图书馆出版习惯。

这样的代码更改相对较少:

代码语言:javascript
运行
复制
private class InsertXMLDataProcedure extends StoredProcedure {

    public InsertXMLDataProcedure(DataSource ds) {
        super(ds, PROCEDURE_NAME);
        declareParameter(new SqlParameter("COMPANYNO", Types.INTEGER));
        declareParameter(new SqlParameter("XMLDATA", OracleTypes.OPAQUE, "SYS.XMLTYPE"));
        declareParameter(new SqlParameter("ERRORNO", Types.INTEGER));
        declareParameter(new SqlParameter("ERRORDESC", Types.VARCHAR));
        compile();
    }

    public Map<String, Object> execute(int companyNumber, String xmlData, int errorNumber, String errorDescription) {
        return super.execute(companyNumber, new OracleXmlTypeValue(xmlData), errorNumber, errorDescription);
    }
}

基本上可以归结为将参数类型更改为:

代码语言:javascript
运行
复制
new SqlParameter("XMLDATA", OracleTypes.OPAQUE, "SYS.XMLTYPE")

并将xml包装到OracleXmlTypeValue对象中。

这两种方法都可以在spring的扩展中获得。编写本报告时的maven依赖项如下:

代码语言:javascript
运行
复制
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-oracle</artifactId>
    <version>1.1.0.RELEASE</version>
</dependency>

这是很简单的一点。您还必须提供一组jars来完成这项工作。它们不在任何maven存储库中,您必须在本地安装它们,或者将它们上传到本地附件中。

有关的罐子是:

  • xdb6.jar
  • xmlparserv2.jar

xdb6.jar可从位于http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html的Oracle驱动程序下载页面的(OTN)获得。

找到xmlparserv2.jar要困难得多。如果幸运的话,您将在数据库机器上的{ORACLE_HOME}/oracle/produce/{VERSION_NUMBER}/lib/xmlparserrv2.jar中找到它。如果不是,就像我一样,您会发现它与Jdeveloper一起打包,可以在这里获得:http://www.oracle.com/technetwork/developer-tools/jdev/downloads/index.html --您应该选择Java,jar在modules/oracle.xdk_12.1.3中。

不要试图直接下载XDK,这是一个旧版本。使用该库将给java.lang.NoClassDefFoundError: oracle/xml/binxml/BinXMLMetadataProvider。甲骨文悄然改变了xmlparserv2.jar的内容,而没有跳过这个版本;就像我说过的“拜占庭习惯”。

注:所有这些都适用于Oracle 11及更高版本。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28085992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档