作者:fjkfjaslfjsal_577 | 来源:互联网 | 2023-05-25 15:57
我有一个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 execute(int companyNumber, String xmlData, int errorNumber, String errorDescription) {
return super.execute(companyNumber, xmlData, errorNumber, errorDescription);
}
}
但是,XML输入未插入表中.显然,Oracle要求供应商特定的配置设置来识别输入.
1> Erik Schmieg..:
好吧,由于甲骨文的拜占庭图书馆出版习惯,解决这个问题是一个很小的依赖性憎恶.
代码更改因此相对最小:
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 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依赖关系如下:
org.springframework.data
spring-data-oracle
1.1.0.RELEASE
现在这很简单.你还必须提供一套罐子来完成这项工作.这些不在任何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及更高版本.