Este tutorial ha sido analizado por nuestros expertos así se asegura la veracidad de nuestro post.
Solución:
Es mucho más fácil:
PreparedStatement pstmt =
conn.prepareStatement("update blob_table set blob = ? where id = ?");
File blob = new File("/path/to/picture.png");
FileInputStream in = new FileInputStream(blob);
// the cast to int is necessary because with JDBC 4 there is
// also a version of this method with a (int, long)
// but that is not implemented by Oracle
pstmt.setBinaryStream(1, in, (int)blob.length());
pstmt.setInt(2, 42); // set the PK value
pstmt.executeUpdate();
conn.commit();
pstmt.close();
Funciona igual cuando se usa una instrucción INSERT. No hay necesidad de empty_blob()
y una segunda declaración de actualización.
Además de la respuesta de a_horse_with_no_name (que se basa en PreparedStatement.setBinaryStream (…) API), hay al menos dos opciones más para BLOB y 3 más para CLOB y NCLOB:
-
Cree explícitamente un LOB, escríbalo y utilice
PreparedStatement.setBlob(int, Blob)
:int insertBlobViaSetBlob(final Connection conn, final String tableName, final int id, final byte value[]) throws SQLException, IOException try (final PreparedStatement pstmt = conn.prepareStatement(String.format("INSERT INTO %s (ID, VALUE) VALUES (?, ?)", tableName))) final Blob blob = conn.createBlob(); try (final OutputStream out = new BufferedOutputStream(blob.setBinaryStream(1L))) out.write(value); pstmt.setInt(1, id); pstmt.setBlob(2, blob); return pstmt.executeUpdate();
-
Actualizar un LOB vacío (insertado mediante
DBMS_LOB.EMPTY_BLOB()
oDBMS_LOB.EMPTY_CLOB()
) víaSELECT ... FOR UPDATE
. Esto es específico de Oracle y requiere que se ejecuten dos declaraciones en lugar de una. Además, esto es lo que estaba tratando de lograr en primer lugar:void insertBlobViaSelectForUpdate(final Connection conn, final String tableName, final int id, final byte value[]) throws SQLException, IOException try (final PreparedStatement pstmt = conn.prepareStatement(String.format("INSERT INTO %s (ID, VALUE) VALUES (?, EMPTY_BLOB())", tableName))) pstmt.setInt(1, id); pstmt.executeUpdate(); try (final PreparedStatement pstmt = conn.prepareStatement(String.format("SELECT VALUE FROM %s WHERE ID = ? FOR UPDATE", tableName))) pstmt.setInt(1, id); try (final ResultSet rset = pstmt.executeQuery()) while (rset.next()) final Blob blob = rset.getBlob(1); try (final OutputStream out = new BufferedOutputStream(blob.setBinaryStream(1L))) out.write(value);
-
Para CLOB y NCLOB, puede utilizar adicionalmente
PreparedStatement.setString()
ysetNString()
, respectivamente.
Más adelante puedes encontrar las observaciones de otros creadores, tú además tienes la opción de mostrar el tuyo si lo crees conveniente.