【问题标题】:Issue inserting Oracle Blob content into another record using Java使用 Java 将 Oracle Blob 内容插入另一条记录时出现问题
【发布时间】:2019-06-25 04:06:37
【问题描述】:

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

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

用于读写的代码

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();

【问题讨论】:

    标签: java oracle oracle-sqldeveloper oracle12c


    【解决方案1】:
    1. Connection.prepareCall() 用于创建调用存储过程的Statement。如果你想这样做,那么你应该在数据库中定义一个 SP,在这个方法的范围之外,并通过你的 [Callable]Statement 按名称调用它。但是如果只是为了获取分配给新行的DOC_ID,那么还有其他方法,比如Statement.getGeneratedKeys()

    2. 不要使用 InputStream.available() 来确定 blob 的大小。 “可用”是指没有阻塞现在可读的字节数,它可以是任意不准确的低估——甚至为零。它不是最终可以从流中读取的字节总数的可靠度量。而是使用Bloblength() 方法。

    【讨论】:

    • 谢谢你,约翰。使用 blob 的长度而不是 input.available() 有效。
    猜你喜欢
    • 2017-06-02
    • 2019-09-01
    • 2015-09-12
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 2023-02-04
    相关资源
    最近更新 更多