【问题标题】:Which settings do I have to configure to use XML as input Parameter with Oracle using Spring's stored procedure使用 Spring 的存储过程,我必须配置哪些设置才能使用 XML 作为 Oracle 的输入参数
【发布时间】:2016-10-09 17:52:21
【问题描述】:

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

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 需要供应商特定的配置设置来识别输入。

【问题讨论】:

  • 使用 setSql 作为过程名称。
  • super(ds, PROCEDURE_NAME) 引用受保护的 StoredProcedure(DataSource ds, String name) { setDataSource(ds); setSql(名称); } 在超类中,即涵盖了
  • 您可以将 Types.STRUCT 用于 xml 数据 Erik

标签: java xml spring oracle


【解决方案1】:

好的,由于 Oracle 的拜占庭式库发布习惯,因此修复此问题是一个小小的依赖问题。

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

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);
    }
}

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

new SqlParameter("XMLDATA", OracleTypes.OPAQUE, "SYS.XMLTYPE")

并将 xml 包装到 OracleXmlTypeValue 对象中。

两者都在 spring 的 spring-data-oracle 扩展中可用。撰写本文时的maven依赖如下:

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-oracle</artifactId>
    <version>1.1.0.RELEASE</version>
</dependency>

现在这很容易。您还必须提供一组罐子才能完成这项工作。这些不在任何 maven 存储库中,您必须在本地安装它们或将它们上传到本地连接。

有问题的罐子是:

  • xdb6.jar
  • xmlparserv2.jar

xdb6.jar 可从 Oracle 驱动程序下载页面上的 Oracle 技术网 (OTN) 获得,地址为 http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html

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。 Oracle 悄悄地更改了 xmlparserv2.jar 的内容,但没有改变版本;正如我所说的拜占庭习惯。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 2022-07-06
    • 2018-01-03
    • 1970-01-01
    • 2013-02-06
    相关资源
    最近更新 更多