Saltar al contenido

¿Cómo escribir / actualizar Oracle blob de manera confiable?

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:

  1. 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();
        
    
    
  2. Actualizar un LOB vacío (insertado mediante DBMS_LOB.EMPTY_BLOB() o DBMS_LOB.EMPTY_CLOB()) vía SELECT ... 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);
                    
                
            
        
    
    
  3. Para CLOB y NCLOB, puede utilizar adicionalmente PreparedStatement.setString() y setNString(), 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *