Blob, importação

Olá amigos,

Estou tentando importar um arquivo binario para o banco de dados Oracle pelo java.

Fiz todo o código


public ImportBlob() {
        try{
            int length;
            long tam_blob;
            oracle.sql.BLOB blob;
            
            SQL = "delete from demo where id=7";
            conn.Insert(SQL);
            SQL = "insert into demo(id,theBlob) values(7,empty_blob())";
            conn.Insert(SQL);
            
            System.out.println("Ready");
            
            rs = conn.Select("select theBlob from demo where id=7");
            rs.next();
            
            blob = ((oracle.jdbc.driver.OracleResultSet)rs).getBLOB(1);
            
            java.io.File url = new java.io.File("Iceberg.jpg");
            java.io.FileInputStream instream = new java.io.FileInputStream(url);
            java.io.OutputStream outstream = blob.getBinaryOutputStream();
            
            byte[] chunk = new byte[blob.getChunkSize()];
            
            int i=-1;
            System.out.println("Loading");
            while((i = instream.read(chunk)) != -1){ 
                outstream.write(chunk,0,i); 
                System.out.print('.');
            }
            System.out.println("
Desenho Carregado");
            instream.close();
            outstream.close();
            conn.setClose();
            
            System.out.println("Finish");
        }catch(java.io.IOException ex){
            ex.printStackTrace();
            System.out.println("2 = "+ex.getMessage());
        }catch(java.sql.SQLException ex){
            ex.printStackTrace();
            System.out.println("3 = "+ex);
        }catch(Exception ex){
            ex.printStackTrace();
            System.out.println("4 = "+ex);
        }
    }

Mas ocorre o seguinte erro, quando está lendo o binário.

java.io.IOException: ORA-22920: linha contendo o valor de LOB não está bloqueada
ORA-06512: em "SYS.DBMS_LOB", line 700
ORA-06512: em line 1

        at oracle.jdbc.dbaccess.DBError.SQLToIOException(DBError.java:618)
        at oracle.jdbc.driver.OracleBlobOutputStream.flushBuffer(OracleBlobOutputStream.java:195)
        at oracle.jdbc.driver.OracleBlobOutputStream.flush(OracleBlobOutputStream.java:157)
        at ImportBlob.<init>(ImportBlob.java:34)
        at ImportBlob.main(ImportBlob.java:56)
2 = ORA-22920: linha contendo o valor de LOB não está bloqueada
ORA-06512: em "SYS.DBMS_LOB", line 700
ORA-06512: em line 1

Desde já agradeço sua ajuda…

O problema é do select que precisa do for update ficaria assim


select theBlob from demo where id=7 for update

Porém para funcionar o autocommit deve estar desligado

valeu

aproveitando a thread, que menciona o uso de blob no oracle, realmente acho muito escroto ter que usar o oracle.jdbc.driver.OracleResultSet para acessar funcoes especificas do oracle para manipular blobs. Tentei diversas vezes usar os get/setBlob’s da API jdbc padrao , sem sucesso, com o oracle. Gostaria de fazer um codigo portavel para manipular blobs.

Alguem ja conseguiu manipular blobs no oracle sem usar essas extensoes da oracle? sera que alguem poderia postar algum exemplo disso?

Um PreparedStatement padrao, usando setBinaryStream(parameterId, stream, streamSize) não funciona ?