您正在尝试将二进制数据直接插入 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 问题。