jdbc シン ドライバーを使用して BLOB を Oracle データベースに挿入する方法について Web を検索すると、ほとんどの Web ページで 3 段階のアプローチが提案されています。
- 値を挿入し
empty_blob()
ます。 - で行を選択します
for update
。 - 実際の値を挿入します。
これは私にとってはうまくいきます。例を次に示します。
Connection oracleConnection = ...
byte[] testArray = ...
PreparedStatement ps = oracleConnection.prepareStatement(
"insert into test (id, blobfield) values(?, empty_blob())");
ps.setInt(1, 100);
ps.executeUpdate();
ps.close();
ps = oracleConnection.prepareStatement(
"select blobfield from test where id = ? for update");
ps.setInt(1, 100);
OracleResultSet rs = (OracleResultSet) ps.executeQuery();
if (rs.next()) {
BLOB blob = (BLOB) rs.getBLOB(1);
OutputStream outputStream = blob.setBinaryStream(0L);
InputStream inputStream = new ByteArrayInputStream(testArray);
byte[] buffer = new byte[blob.getBufferSize()];
int byteread = 0;
while ((byteread = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, byteread);
}
outputStream.close();
inputStream.close();
}
作成者がより単純な 1 ステップのソリューションを使用することを提案している Web ページがいくつかあります。このソリューションの前の例:
Connection oracleConnection = ...
byte[] testArray = ...
PreparedStatement ps = oracleConnection.prepareStatement(
"insert into test(id, blobfield) values(?, ?)");
BLOB blob = BLOB.createTemporary(oracleConnection, false, BLOB.DURATION_SESSION);
OutputStream outputStream = blob.setBinaryStream(0L);
InputStream inputStream = new ByteArrayInputStream(testArray);
byte[] buffer = new byte[blob.getBufferSize()];
int byteread = 0;
while ((byteread = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, byteread);
}
outputStream.close();
inputStream.close();
ps.setInt(1, 100);
ps.setBlob(2, blob);
ps.executeUpdate();
ps.close();
2 番目のコードははるかに簡単なので、私の質問は次のとおりです。最初の (一般的な) ソリューションのポイントは何ですか? 2 番目のソリューション (Oracle サーバーのバージョン番号、jdbc ドライバーのバージョン、BLOB のサイズなど) になんらかの制約がありますか? 最初の解決策は優れていますか (速度、メモリ消費量など)? より単純な 2 番目のアプローチを使用しない理由はありますか?
まったく同じ質問が CLOB フィールドにも当てはまります。