Проблема вставки содержимого Oracle Blob в другую запись с использованием Java - PullRequest
0 голосов
/ 31 января 2019

Я работаю над проверкой концепции, чтобы читать содержимое BLOB-объектов из Oracle, манипулировать им, а затем вставлять обратно как новую запись, используя Java.В настоящее время я пытаюсь просто прочитать, а затем записать содержимое блобов в Oracle, но сталкиваюсь с проблемами.Я могу написать обратно, но похоже, что файл вставляется не полностью.

Ошибка при попытке просмотреть / загрузить Blob с помощью разработчика SQL

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 голосов
/ 31 января 2019
  1. Connection.prepareCall() - для создания Statement, который вызывает хранимую процедуру.Если вы хотите сделать это, вы должны определить SP в базе данных, выходящий за рамки этого метода, и назвать его по имени через [Callable] Statement.Но если единственной целью является получение DOC_ID, назначенного новой строке, то есть другие способы, такие как Statement.getGeneratedKeys().

  2. Не используйте InputStream.available() для определения размеракапли.«Доступно» означает число считываемых байтов без блокировки , прямо сейчас , и допускается произвольно неточная недооценка - даже ноль.Это не является надежной мерой общего количества байтов, которые в конечном итоге могут быть прочитаны из потока.Вместо этого используйте метод Blob length().

...