使用Java将Oracle Blob内容插入另一条记录时出现问题

时间:2019-01-31 16:22:21

标签: java oracle oracle-sqldeveloper oracle12c

我正在研究概念验证,以从Oracle读取blob内容,对其进行处理,然后使用Java作为新记录插入。目前,我正在尝试读取blob内容,然后再将其写回到Oracle,但遇到了问题。我可以写回,但是看起来文件没有完全插入。

尝试通过SQL开发人员查看/下载Blob时出错

Error

用于读写的代码

conn.setAutoCommit(false);
stmt = conn.createStatement();
sql = "SELECT DOC_ID, NAME, BLOB_CONTENT FROM DOCUMENTS WHERE DOC_ID = " + String.valueOf(docid);

ResultSet rs_docs = stmt.executeQuery(sql);
while (rs_docs.next()) {



Show_Message("Conversion sub process started ...");
doc_name = rs_docs.getString("name");
Blob ib = rs_docs.getBlob("blob_content");


Show_Message("Uploading converted pdf to database ... ");
InputStream input = ib.getBinaryStream();
String filename = doc_name;

CallableStatement callableStatement = conn.prepareCall("begin INSERT INTO DOCUMENTS(NAME, BLOB_CONTENT) VALUES(?,?) RETURNING DOC_ID INTO ?; end;");
callableStatement.setString(1, filename);
callableStatement.setBinaryStream(2, input, input.available());
callableStatement.registerOutParameter(3, Types.INTEGER);
callableStatement.executeQuery();
docid = callableStatement.getInt(3);
callableStatement.close();

Show_Message("New record created, doc # " + String.valueOf(docid));
Show_Message("Conversion Process completed!!!");

}
stmt.close();
conn.commit();
conn.close();
rs_docs.close();

1 个答案:

答案 0 :(得分:1)

  1. Connection.prepareCall()用于创建调用存储过程的Statement。如果要执行此操作,则应在此方法范围之外的数据库中定义一个SP,然后通过[Callable] Statement按名称进行调用。但是,如果唯一的目的就是获取分配给新行的DOC_ID,那么还有其他方法,例如Statement.getGeneratedKeys()

  2. 请勿使用InputStream.available()来确定Blob的大小。 “可用”是指无阻塞,现在 的可读字节数,并且可以是任意不准确的低估-甚至是零。这不是对最终可能从流中读取的字节总数的可靠度量。而是使用Blob的{​​{1}}方法。

相关问题