[Dica] Finalmente como tirar arquivo BLOB e jogar no Disco

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
meguelito
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 60
Registrado em: Ter, 17 Jan 2006 1:45 pm
Localização: Santa Catarina
Att.:
Alan Juliano Metzger
Programador Oracle
Inside System Informática
Msn/E-mail: alanjuliano@yahoo.com.br

Boa Tarde galera depois de muita procura e muito suador consegui tirar um arquivo de um campo BLOB e jogar para o disco no Oracle 9i, que tem limitação de 32k, porém com a rotina que mando abaixo você pode ter o arquivo que for do tamanho que for.

Selecionar tudo

CREATE OR REPLACE PROCEDURE RETRIEVE_LOB IS

  TEMP_BLOB     BLOB;
  DATA_BUFFER   RAW(32767);
  TEMP_BUFFER   VARCHAR2(1);
  AMOUNT        BINARY_INTEGER := 1;
  POSITION      INTEGER := 1;
  FILEHANDLE    UTL_FILE.FILE_TYPE;
  ERROR_NUMBER  NUMBER;
  ERROR_MESSAGE VARCHAR2(100);
  LENGTH_COUNT  INTEGER;

BEGIN

  SELECT TEXTO INTO TEMP_BLOB FROM TESTE WHERE ROWNUM = 1;
  LENGTH_COUNT := DBMS_LOB.GETLENGTH(TEMP_BLOB);
  DBMS_OUTPUT.PUT_LINE('INTERNAL LOB SIZE IS: ' || LENGTH_COUNT);
  FILEHANDLE := UTL_FILE.FOPEN('DIRLOB', 'ARQUIVO.PDF', 'W', 32760);
  WHILE LENGTH_COUNT <> 0 LOOP
  
    DBMS_LOB.READ(TEMP_BLOB, AMOUNT, POSITION, DATA_BUFFER);
    UTL_FILE.PUT_RAW(FILEHANDLE, DATA_BUFFER, TRUE);
    POSITION     := POSITION + 1;
    LENGTH_COUNT := LENGTH_COUNT - 1;
    DATA_BUFFER  := NULL;
  
  END LOOP;
  DBMS_OUTPUT.PUT_LINE('EXIT THE LOOP');
  UTL_FILE.FCLOSE(FILEHANDLE);
  DBMS_OUTPUT.PUT_LINE('CLOSE THE FILE');

EXCEPTION
  WHEN OTHERS THEN
    BEGIN
      ERROR_NUMBER  := SQLCODE;
      ERROR_MESSAGE := SUBSTR(SQLERRM, 1, 100);
      DBMS_OUTPUT.PUT_LINE('ERROR #: ' || ERROR_NUMBER);
      DBMS_OUTPUT.PUT_LINE('ERROR MESSAGE: ' || ERROR_MESSAGE);
      UTL_FILE.FCLOSE_ALL;
    END;

END;
Avatar do usuário
alef
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 119
Registrado em: Ter, 06 Nov 2007 2:45 pm
Localização: Patos de Minas - MG
Alexandre Matos
Patos de Minas - MG
Do interior de Minas para o resto do Mundo

meguelito

testei sua procedure infelizmente com jpg ela não funciona ela distorce completamente as cores da imagem. você sabe porque? seria erro da versão do banco?
eu uso o 9.2.0.1
no 10g XE funcionou 100% mas no 9 num vai nem que a vaca tussa.

obrigado,

e espero que possa me ajudar
meguelito
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 60
Registrado em: Ter, 17 Jan 2006 1:45 pm
Localização: Santa Catarina
Att.:
Alan Juliano Metzger
Programador Oracle
Inside System Informática
Msn/E-mail: alanjuliano@yahoo.com.br

E aí cara beleza? pois é não tenho nenhum 9.2.0.1 mas testei com o 9.2.0.7 e funcionou 100% com uma figura de 500Kb, e abriu certinho, sem nenhum problema.

Isso pode ser um BUG do 9.2.0.1.

Usei o seguinte comando para adicionar a figura:

Selecionar tudo

declare

   l_blob    blob;
   l_bfile   bfile;

begin
  
  insert into LOB_ALAN values ( empty_blob() )  returning CD_LOB into l_blob;
  l_bfile := bfilename( 'DIR_ARQ', 'Slack.jpg' );
  dbms_lob.fileopen( l_bfile );
  dbms_lob.loadfromfile( l_blob, l_bfile, dbms_lob.getlength( l_bfile ) );
  dbms_lob.fileclose( l_bfile );
  
end;
e depois usei a procedure acima para retirar e colocar no disco.

Att.:
Alan Juliano Metzger
DBA / Suporte Oracle
Msn: alanjuliano@yahoo.com.br
Avatar do usuário
alef
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 119
Registrado em: Ter, 06 Nov 2007 2:45 pm
Localização: Patos de Minas - MG
Alexandre Matos
Patos de Minas - MG
Do interior de Minas para o resto do Mundo

você acabou de esclarecer as minhas duvidas, é justamente um bug da versão, como eu havia suspeitado.

muito obrigado ^^
Avatar do usuário
alef
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 119
Registrado em: Ter, 06 Nov 2007 2:45 pm
Localização: Patos de Minas - MG
Alexandre Matos
Patos de Minas - MG
Do interior de Minas para o resto do Mundo

eu podia jurar que era bug da versão, mas o erro ainda continua vou colocar as imagens aqui antes e depois pra você ver o que acontece

Antes
Imagem

depois
Imagem


se eu usar o PLSQL Developer pra extrair a imagem de dentro do banco, ela fica perfeita, mas usando os codigos que você me passou, e sai do jeito que coloquei acima.
Alem de demorar muito pra executar a procedure e aumentar o tamanho do arquivo.

se você puder me ajudar. fico agradecido.
Responder
  • Informação