使用Java 8和Oracle 11g。关于将XML数据从平面文件加载到Oracle XMLType字段中。我可以使用以下代码进行操作:
private String readAllBytesJava7(String filePath) {
Files files;
Paths paths;
String content;
content = "";
try {
content = new String ( Files.readAllBytes( Paths.get(filePath) ) );
}
catch (IOException e) {
log.error(e);
}
return content;
}
pstmt = oracleConnection.prepareStatement("update MYTABLE set XML_SOURCE = ? where TRANSACTION_NO = ?");
xmlFileAsString = this.readAllBytesJava7(fileTempLocation);
xmlType = XMLType.createXML(oracleConnection, xmlFileAsString);
pstmt.setObject(1,xmlType);
pstmt.setInt(2, ataSpecHeader.id);
pstmt.executeUpdate();
但是您可能会猜想,这仅适用于小型XML文件...太大的内容都会导致内存异常。
我想做的是按如下所述将XML文件加载为“块”:
https://docs.oracle.com/cd/A97335_02/apps.102/a83724/oralob2.htm 和 https://community.oracle.com/thread/4721
这些文章显示了如何通过“块”从平面文件加载BLOB / CLOB列。如果该列为blob / clob,则可以使其工作,但我无法将其用于XMLType列。我在网上找到的有关加载XMLType列的大多数内容都是使用oracle目录对象或sql-loader进行的,但我无法将其用作解决方案。有人知道如何以“块”的形式将XML文件加载到XMLType列中的帖子/示例吗?
其他信息: 我试图将我在blob / clob帖子中看到的内容用于XMLType。这是我面临的问题:
sqlXml = oracleConnection.createSQLXML();
pstmt = oracleConnection.prepareStatement("update MYTABLE set
XML_SOURCE = XMLType.createXML('<e/>') where 1=1 and TRANSACTION_NO = ?");
pstmt.setInt(1, ataSpecHeader.id);
pstmt.executeUpdate();
使用blob / clob,您首先将blob / clob字段设置为“空”(因此它不为null)...我不确定如何使用XMLType做到这一点...可以将其设置为如上所述的xml。
下一步是选择blob / clob字段并在其上获取输出流。类似于此处显示的内容:
cmd = "SELECT XML_SOURCE FROM MYTABLE WHERE TRANSACTION_NO = ${ataSpecHeader.id} FOR UPDATE ";
stmt = oracleConnection.createStatement();
rset = stmt.executeQuery(cmd);
rset.next();
xmlType = ((OracleResultSet)rset).getOPAQUE(1);
//clob = ((OracleResultSet)rset).getCLOB(1);
//blob = ((OracleResultSet)rset).getBLOB(1);
clob = xmlType.getClobVal();
//sqlXml = rset.getSQLXML(1);
//outstream = sqlXml.setBinaryStream();
//outstream = blob.getBinaryOutputStream();
outstream = clob.getAsciiOutputStream();
//At this point, read the XML file in "chunks" and write it to the outstream object by doing: outstream.write
被注释掉的行是为了显示我尝试过的不同内容。重新声明...如果表中的字段是BLOB或CLOB,我可以使其正常工作。但是我不确定如果是XMLType怎么办。我想获取XMLType字段的下游句柄,以便可以对其进行写入,就像它是BLOB或CLOB一样。注意,对于BLOB / CLOB,它选择带有“ for update”的blob / clob字段,然后在其上获取一个Outstream,以便我对其进行写入。对于XMLType,我尝试将字段添加到XMLType Java类和SQLXML Java类,但是那样行不通。我还尝试过先将字段获取为xmltype / sqlxml,然后强制转换为blob / clob以获取输出,但是它也不起作用。事实是,我不确定应该做些什么才能能够以流/块的形式写入XMLType字段。