Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle XMLType-作为块从XML平面文件加载_Oracle_Xmltype - Fatal编程技术网

Oracle XMLType-作为块从XML平面文件加载

Oracle XMLType-作为块从XML平面文件加载,oracle,xmltype,Oracle,Xmltype,使用Java8和Oracle11g。关于将XML数据从平面文件加载到Oracle XMLType字段。我可以使用以下代码使其工作: private String readAllBytesJava7(String filePath) { Files files; Paths paths; String content; content = ""; try { content = new String ( Files.readAl

使用Java8和Oracle11g。关于将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文件,如下所述:

这些帖子展示了如何通过“块”从平面文件加载BLOB/CLOB列。如果列是blob/clob,我可以让它工作,但是我不能将它调整为XMLType列。我在网上找到的关于加载XMLType列的大部分内容都涉及使用oracle目录对象或sqlloader,但我无法将它们用作我的解决方案。有没有人知道如何将XML文件作为“块”加载到XMLType列中的post/示例

其他信息: 我试图将我在帖子中看到的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,我可以使其正常工作。但如果它是XMLType,我不确定该怎么办。我希望得到XMLType字段的扩展句柄,以便可以对其进行写入,就像它是BLOB或CLOB一样。注意,对于BLOB/CLOB,它选择带有“for update”的BLOB/CLOB字段,然后在其上获得一个扩展流,以便我可以对其进行写入。对于XMLType,我尝试将字段设置为xmltypejava类和sqlxmljava类,但这种方式行不通。我还尝试先将字段获取为xmltype/sqlxml,然后将其转换为blob/clob,然后获取一个扩展流,但这也不起作用。事实上,我不知道我应该怎么做才能以流/块的形式写入XMLType字段。

如果可以使用CLOB,难道不能将更新更改为
set XML\u SOURCE=XMLType(?)
?这仍然会让我面临同样的问题。。。。如果我正在更新的clob变量太大,那么它将导致内存异常。即使该字段是clob字段,也会发生这种情况。。。这就是为什么这些帖子中展示的技术对于将大clob值放入数据库是必要的。。。它必须通过流/块来完成,而不是直接的更新。。。在调整XMLType的两篇文章中所示的方法时,我正在努力解决的两个主要问题是:1)将XMLType初始化为空(而不是空)。。。对于blob/clob,都有一个empty_blob()和empty_clob()方法将它们初始化为empty(与null相反),作为开始写入的起点。我不知道如何对XMLType执行此操作。第二点是获取对XMLType的引用,该引用允许您获得一个输出流,您可以使用它以“块”的形式写入。对于blob和clob,您可以对blob/clob执行“get blob/clob”,然后对其执行“get Outputstream”,通过该操作您可以对其进行写入。不知道如何使用XMLtypeMy的第一条注释意味着您可以使用已经找到的机制将
绑定为CLOB。然后Oracle将该CLOB转换为XMLType。另一种方法是使用
.getClobVal()
并将其作为流式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