Вставьте файл xml в XMLTable с помощью JDBC

Я создал таблицу XMLType в Oracle. Я пытаюсь вставить файл XML в таблицу с помощью JDBC. Это бросает -

ORA-00932: inconsistent datatypes: expected - got BINARY

Код -

       OraclePreparedStatement  statement = (OraclePreparedStatement) getConnection().prepareStatement
       ("insert into person values(?)");
       FileInputStream fileinp =  new FileInputStream(file);
       statement.setBinaryStream(1, fileinp, fileLength);      
       statement.executeUpdate();

person user32262    schedule 09.01.2014    source источник


Ответы (2)


Вы пытаетесь вставить двоичные данные непосредственно в столбец XMLType, и для этого нет неявного приведения. Предполагая, что ваш файл на самом деле является текстом, который вы можете рассматривать как CLOB, а не как BLOB:

OraclePreparedStatement statement =
  (OraclePreparedStatement) getConnection().prepareStatement(
    "insert into person values(xmltype(?))");
FileInputStream fileinp =  new FileInputStream(file);
InputStreamReader filerdr = new InputStreamReader(fileinp);
pStmt.setCharacterStream(1, filerdr, fileLength);
pStmt.executeUpdate();

Обратите внимание, что оператор теперь использует xmltype(?) (хотя он работает и без этого, поскольку есть неявное приведение типов из CLOB, но я думаю, что в любом случае лучше быть явным); и я использую InputStreamReader для передачи текста. Вы можете и, вероятно, должны использовать буферизованный ридер:

FileInputStream fileinp =  new FileInputStream(file);
InputStreamReader filerdr = new InputStreamReader(fileinp);
BufferedReader filebuf = new BufferedReader(filerdr);
pStmt.setCharacterStream(1, filebuf, fileLength);
pStmt.executeUpdate();

Протестировано со столбцом XMLType в обычной таблице и с таблицей XMLType.

Передача текстового файла с помощью setBinaryStream приводит к путанице с XMLType; с тем же действительным файлом при использовании setBinaryStream() возникает ошибка:

ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00210: expected '<' instead of '3'

Вероятно, есть способ обойти это, но я предполагаю, что ваш файл представляет собой просто текст и не будет проблемой как CLOB.

person Alex Poole    schedule 29.01.2014

Как я вижу в официальной документации здесь можно вставить XMLType в Java одним из двух способов:

  • С помощью CLOB или привязки строки
  • С помощью setObject() или setOPAQUE() с использованием

Я бы прочитал файл в строку, а затем использовал его для запроса на вставку

person wannaKnowItAll    schedule 23.01.2014