Estoy trabajando en una aplicación para hacer un procesamiento por lotes, y quiero almacenar los datos de entrada y salida como archivos en campos BLOB en una base de datos Oracle. La versión de Oracle es 10g r2.¿Cómo coloco BLOB grandes (o al menos no triviales) en Oracle con JDBC?
Usando el método PreparedStatement.setBinaryStream() como a continuación, insertaré un pequeño archivo de texto en la base de datos, pero no estoy teniendo suerte con un archivo de imagen más grande.
¿Estoy haciendo algo mal? ¿Es esto posible con JDBC? ¿Tendré que molestar al DBA? Gracias por tu ayuda.
EDITAR: Se ha resuelto el problema. He actualizado el código para una muestra de trabajo:
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();
}
}
}
Vincent, gracias por su respuesta bien pensada que enlaza a la documentación oficial de Oracle. Desafortunadamente, una vez que traté de seguir su ejemplo comencé a recibir errores de ORA-01002 tan pronto como emití la consulta PARA ACTUALIZAR. – Phil
@Phil: el ORA-01002 no parece estar relacionado con BLOB. ¿Desactivó la confirmación automática primero? (necesitaría una transacción para que esto funcione => desactivar la confirmación automática) –
¡Gracias, eso funcionó! – Phil