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

Eri*_*low 2 java xml oracle spring

我有一个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);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,XML输入未插入表中.显然,Oracle要求供应商特定的配置设置来识别输入.

Eri*_*low 7

好吧,由于甲骨文的拜占庭图书馆出版习惯,解决这个问题是一个很小的依赖性憎恶.

代码更改因此相对最小:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

new SqlParameter("XMLDATA", OracleTypes.OPAQUE, "SYS.XMLTYPE")
Run Code Online (Sandbox Code Playgroud)

并将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>
Run Code Online (Sandbox Code Playgroud)

现在这很简单.你还必须提供一套罐子来完成这项工作.这些不在任何maven存储库中,您必须在本地安装它们或将它们上传到您的本地连接.

有问题的罐子是:

  • xdb6.jar
  • xmlparserv2.jar

xdb6.jar可从Oracle驱动程序下载页面上的Oracle Technology Network(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版本,罐子里面modules/oracle.xdk_12.1.3.

不要试图直接下载XDK,这是一个旧版本.使用该库将给出java.lang.NoClassDefFoundError: oracle/xml/binxml/BinXMLMetadataProvider.Oracle悄悄地改变了xmlparserv2.jar的内容而没有碰到版本; 正如我所说的拜占庭习惯.

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