我必须配置哪些设置才能使用 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 及更高版本。
我有一个 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 及更高版本。