Blob, importação

3 respostas
Y

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…

3 Respostas

Y

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

T

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?

N

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

Criado 13 de agosto de 2003
Ultima resposta 18 de ago. de 2003
Respostas 3
Participantes 3