我必须配置哪些设置才能使用 XML 作为 Oracle 使用 Spring 存储过程的输入参数

Which settings do I have to configure to use XML as input Parameter with Oracle using Spring's stored procedure

我有一个 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 输入没有插入到 table。显然,Oracle 需要供应商特定的配置设置来识别输入。

好的,由于 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 存储库中,您必须在本地安装它们或将它们上传到本地 nexus。

有问题的罐子是:

  • xdb6.jar
  • xmlparserv2.jar

xdb6.jar 可从位于 http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html 的 Oracle 驱动程序下载页面上的 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。 Oracle 悄悄地更改了 xmlparserv2.jar 的内容,但没有改变版本;正如我所说的拜占庭习惯。

N.B。所有这些都适用于 Oracle 11 及更高版本。