Oracle XMLType - загрузка из плоского XML-файла в виде фрагментов - PullRequest
0 голосов
/ 28 августа 2018

Использование 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-directory или использования 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 как «пустое» (чтобы оно не было нулевым) ... Я не уверен, как это сделать с 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 он выбирает поле blob / clob с помощью «для обновления», а затем получает на него Outstream, чтобы я мог писать в него. Для XMLType я попытался получить поле для Java-класса XMLType и Java-класса SQLXML, но это не сработает. Я также попытался сначала получить поле как xmltype / sqlxml, а затем преобразовать в blob / clob, чтобы затем получить поток, но это также не сработало. Правда в том, что я не уверен, что должен делать, чтобы иметь возможность записи в поле XMLType в виде потока / кусков.

...