gpt4 book ai didi

oracle - 如何使用JDBC将大型(或至少很简单)的BLOB放入Oracle中?

转载 作者:行者123 更新时间:2023-12-04 20:23:56 24 4
gpt4 key购买 nike

我正在一个应用程序上进行批处理,并且希望将输入和输出数据作为文件存储在Oracle数据库的BLOB字段中。 Oracle版本是10g r2。

如下使用PreparedStatement.setBinaryStream()方法会将一个小的文本文件插入数据库,但是对于较大的图像文件我没有任何运气。

难道我做错了什么?这可能与JDBC有关吗?我需要打扰DBA吗?谢谢你的帮助。

编辑:问题已解决。我已将此代码更新为工作示例:

import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;


public class WriteBlobDriver {
public static void main(String[] args) {
Connection con = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection(
"blahblah",
"blahblah",
"blahblah");
con.setAutoCommit(false);
Statement statement = con.createStatement();
//statement.executeUpdate("UPDATE BATCH_GC_JOBS SET INPUT_BATCH_FILE = EMPTY_BLOB() WHERE JOB_ID = 'a'");

//Get blob and associated output stream
ResultSet resultSet = statement.executeQuery("SELECT INPUT_BATCH_FILE FROM BATCH_GC_JOBS WHERE JOB_ID = 'a' FOR UPDATE");
resultSet.next();
Blob blob = resultSet.getBlob(1);
OutputStream outputStream = ((oracle.sql.BLOB)blob).getBinaryOutputStream();

// Buffer to hold chunks of data to being written to the Blob.
byte[] buffer = new byte[10* 1024];
int nread = 0;

//Write file to output stream
File file = new File("C:\\TEMP\\Javanese_cat.jpg");
FileInputStream fileInputStream = new FileInputStream(file);
while ((nread = fileInputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, nread);
}

//Cleanup
fileInputStream.close();
outputStream.close();
statement.close();
con.commit();
con.close();
System.out.println("done!");
} catch (Exception e){
e.printStackTrace();
}
}
}

最佳答案

我不认为您可以一步一步(对于数据> 4k)使用JDBC更新或插入到BLOB/CLOB中。从this example from Oracle看来,您需要:

  • 使用SQL函数empty_clob()
  • 插入一个空的LOB
  • 选择以更新您插入的LOB
  • 使用ResultSet.getBlob()获取Java中的LOB,然后使用blob.setBinaryStream获取输出流(因为不赞成使用oracle.sql.BLOB.getBinaryOutputStream())
  • 写入此输出流
  • 完成后
  • 关闭输出流

  • 您将在Pl/SQL中执行类似的操作(“选择要更新一个LOB,然后将其写入”)。

    关于oracle - 如何使用JDBC将大型(或至少很简单)的BLOB放入Oracle中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3189125/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com