Para melhor visualização, recomendo resolução de no mínimo 1280 x 800 e navegador Mozilla Firefox


segunda-feira, 11 de janeiro de 2010

Exportando o conteúdo de uma coluna BLOB para um arquivo em disco através da procedure BLOB_TO_FILE

Por Eduardo Legatti

Olá,

No artigo anterior, eu demonstrei através de exemplos práticos, não só como gerar arquivos externos ao banco de dados, mas também como ler o conteúdo dos mesmos através da package UTL_FILE. Foi demonstrado também um exemplo prático de como carregar arquivos binários para colunas do tipo da dado BLOB em tabelas de banco dados, através do uso da package DBMS_LOB. Bom, o objetivo deste artigo será o de demonstrar a operação inversa, ou seja, demonstrar como salvar o conteúdo de um campo BLOB para um arquivo em disco. Para realizar esta operação utilizarei uma stored procedure que chamarei de BLOB_TO_FILE. No mais, vamos aos exemplos práticos ...

Vale a pena salientar que para esta demonstração, utilizarei o mesmo objeto directory ARQUIVO_DIR que foi criado e discutido no artigo anterior.

SQL> select * from all_directories;

OWNER                     DIRECTORY_NAME           DIRECTORY_PATH
------------------------- ------------------------ ---------------------
SYS                       ARQUIVO_DIR              /tmp


Aproveitando também a estrutura criada e discutida no artigo anterior, irei carregar várias imagens (*.jpg) para a tabela TAB_IMAGEM fazendo uso da stored procedure CARREGA_IMAGEM, mas com algumas modificações que não vem ao caso. Para maiores detalhes sobre a stored procedure CARREGA_IMAGEM, acesse o artigo anterior.

SQL> execute carrega_imagem('imagem1.jpg');
SQL> execute carrega_imagem('imagem2.jpg');
SQL> execute carrega_imagem('imagem3.jpg');
.
.
.
SQL> execute carrega_imagem('imagem21.jpg');


Após realizados os procedimentos acima, a tabela TAB_IMAGEM ficou populada conforme demonstrado abaixo:

SQL> select * from tab_imagem order by id;

        ID NOME                 IMAGEM
---------- -------------------- ---------------------------------------------------------
         1 imagem1.jpg          474946383961DF005100C40000FFFFFFFF00000000009F9F9FFFB ...
         2 imagem2.jpg          474946383961DF005100C40000FFFFFFFF00000000009F9F9FFFB ...
         3 imagem3.jpg          FFD8FFE000104A46494600010101004800480000FFE1380768747 ...
         4 imagem4.jpg          FFD8FFE000104A46494600010101004800480000FFE1380768747 ...
         5 imagem5.jpg          FFD8FFE000104A46494600010101004800480000FFE1380768747 ...
         6 imagem6.jpg          FFD8FFE000104A46494600010101004800480000FFE1380768747 ...
         7 imagem7.jpg          FFD8FFE000104A46494600010101004800480000FFE1380768747 ...
         8 imagem8.jpg          FFD8FFE000104A46494600010101004800480000FFE1380768747 ...
         9 imagem9.jpg          FFD8FFE000104A46494600010101004800480000FFE1380768747 ...
        10 imagem10.jpg         FFD8FFE000104A46494600010101004800480000FFE1380768747 ...
        11 imagem11.jpg         FFD8FFE000104A46494600010101004800480000FFE1380768747 ...
        12 imagem12.jpg         FFD8FFE000104A46494600010101004800480000FFE1380768747 ...
        13 imagem13.jpg         FFD8FFE000104A46494600010101004800480000FFE1380768747 ...
        14 imagem14.jpg         FFD8FFE000104A46494600010101004800480000FFE1380768747 ...
        15 imagem15.jpg         FFD8FFE000104A46494600010101004800480000FFE1380768747 ...
        16 imagem16.jpg         FFD8FFE000104A46494600010101004800480000FFE1380768747 ...
        17 imagem17.jpg         FFD8FFE000104A46494600010101004800480000FFE1380768747 ...
        18 imagem18.jpg         FFD8FFE000104A46494600010101004800480000FFE1380768747 ...
        19 imagem19.jpg         474946383961DF005100C40000FFFFFFFF00000000009F9F9FFFB ...
        20 imagem20.jpg         474946383961DF005100C40000FFFFFFFF00000000009F9F9FFFB ...
        21 imagem21.jpg         474946383961DF005100C40000FFFFFFFF00000000009F9F9FFFB ...

21 linhas selecionadas.


A questão agora é: Como fazer a operação inversa? Digo, como salvar estas imagens de volta para o disco? Bom, depois de algumas pesquisas em alguns sites, blogs, documentação da Oracle, além de realizar alguns ajustes e modificações em códigos PL/SQL aqui e outros ali, cheguei ao fim da criação de uma stored procedure genérica na qual chamei de BLOB_TO_FILE. Para realizar o download do código PL/SQL de criação da stored procedure, clique aqui.

SQL> desc blob_to_file

PROCEDURE blob_to_file
 Nome do Argumento              Tipo                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 P_DIRETORIO                    VARCHAR2                IN
 P_TABELA                       VARCHAR2                IN
 P_COL_NOME                     VARCHAR2                IN
 P_COL_BLOB                     VARCHAR2                IN

Podemos ver pela saída do comando DESCRIBE acima, que a procedure BLOB_TO_FILE aceita 4 parâmetros de entrada:

  • P_DIRETORIO - o nome do objeto directory a ser utilizado para destino dos arquivos que serão criados.
  • P_TABELA - a tabela de banco de dados que contém a coluna BLOB.
  • P_COL_NOME - a coluna que proverá um valor único para a geração do nome do arquivo a ser salvo em disco.
  • P_COL_BLOB - a coluna do tipo de dado BLOB que contém o conteúdo binário que deverá ser salvo em disco.

No mais, irei executar abaixo a stored procedure BLOB_TO_FILE afim de criar os arquivos (*.jpg) no diretório definido pelo objeto directory ARQUIVO_DIR. Irei ativar o parâmetro SERVEROUTPUT do SQL*Plus para "ON" apenas para gerar uma saída de texto, enquanto os registros vão sendo processados pela stored procedure:

C:\>sqlplus scott/tiger

SQL*Plus: Release 11.1.0.6.0 - Production on Seg Jan 11 18:31:56 2010

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

Conectado a:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> set serveroutput on
SQL> execute blob_to_file('ARQUIVO_DIR','TAB_IMAGEM','NOME','IMAGEM');

Tamanho: 1852 bytes para o arquivo: imagem1.jpg
Finalizada a leitura de 1852 bytes para o arquivo: imagem1.jpg
Arquivo criado em disco com sucesso
Tamanho: 1852 bytes para o arquivo: imagem2.jpg
Finalizada a leitura de 1852 bytes para o arquivo: imagem2.jpg
Arquivo criado em disco com sucesso
Tamanho: 218684 bytes para o arquivo: imagem3.jpg
Finalizada a leitura de 32767 bytes para o arquivo: imagem3.jpg
Finalizada a leitura de 65534 bytes para o arquivo: imagem3.jpg
Finalizada a leitura de 98301 bytes para o arquivo: imagem3.jpg
Finalizada a leitura de 131068 bytes para o arquivo: imagem3.jpg
Finalizada a leitura de 163835 bytes para o arquivo: imagem3.jpg
Finalizada a leitura de 196602 bytes para o arquivo: imagem3.jpg
Finalizada a leitura de 218684 bytes para o arquivo: imagem3.jpg
Arquivo criado em disco com sucesso
Tamanho: 218684 bytes para o arquivo: imagem4.jpg
Finalizada a leitura de 32767 bytes para o arquivo: imagem4.jpg
Finalizada a leitura de 65534 bytes para o arquivo: imagem4.jpg
Finalizada a leitura de 98301 bytes para o arquivo: imagem4.jpg
Finalizada a leitura de 131068 bytes para o arquivo: imagem4.jpg
Finalizada a leitura de 163835 bytes para o arquivo: imagem4.jpg
Finalizada a leitura de 196602 bytes para o arquivo: imagem4.jpg
Finalizada a leitura de 218684 bytes para o arquivo: imagem4.jpg
Arquivo criado em disco com sucesso
Tamanho: 218684 bytes para o arquivo: imagem5.jpg
Finalizada a leitura de 32767 bytes para o arquivo: imagem5.jpg
Finalizada a leitura de 65534 bytes para o arquivo: imagem5.jpg
Finalizada a leitura de 98301 bytes para o arquivo: imagem5.jpg
Finalizada a leitura de 131068 bytes para o arquivo: imagem5.jpg
Finalizada a leitura de 163835 bytes para o arquivo: imagem5.jpg
Finalizada a leitura de 196602 bytes para o arquivo: imagem5.jpg
Finalizada a leitura de 218684 bytes para o arquivo: imagem5.jpg
Arquivo criado em disco com sucesso
Tamanho: 218684 bytes para o arquivo: imagem6.jpg
Finalizada a leitura de 32767 bytes para o arquivo: imagem6.jpg
Finalizada a leitura de 65534 bytes para o arquivo: imagem6.jpg
Finalizada a leitura de 98301 bytes para o arquivo: imagem6.jpg
Finalizada a leitura de 131068 bytes para o arquivo: imagem6.jpg
Finalizada a leitura de 163835 bytes para o arquivo: imagem6.jpg
Finalizada a leitura de 196602 bytes para o arquivo: imagem6.jpg
Finalizada a leitura de 218684 bytes para o arquivo: imagem6.jpg
Arquivo criado em disco com sucesso
Tamanho: 218684 bytes para o arquivo: imagem7.jpg
Finalizada a leitura de 32767 bytes para o arquivo: imagem7.jpg
Finalizada a leitura de 65534 bytes para o arquivo: imagem7.jpg
Finalizada a leitura de 98301 bytes para o arquivo: imagem7.jpg
Finalizada a leitura de 131068 bytes para o arquivo: imagem7.jpg
Finalizada a leitura de 163835 bytes para o arquivo: imagem7.jpg
Finalizada a leitura de 196602 bytes para o arquivo: imagem7.jpg
Finalizada a leitura de 218684 bytes para o arquivo: imagem7.jpg
Arquivo criado em disco com sucesso
Tamanho: 218684 bytes para o arquivo: imagem8.jpg
Finalizada a leitura de 32767 bytes para o arquivo: imagem8.jpg
Finalizada a leitura de 65534 bytes para o arquivo: imagem8.jpg
Finalizada a leitura de 98301 bytes para o arquivo: imagem8.jpg
Finalizada a leitura de 131068 bytes para o arquivo: imagem8.jpg
Finalizada a leitura de 163835 bytes para o arquivo: imagem8.jpg
Finalizada a leitura de 196602 bytes para o arquivo: imagem8.jpg
Finalizada a leitura de 218684 bytes para o arquivo: imagem8.jpg
Arquivo criado em disco com sucesso
Tamanho: 218684 bytes para o arquivo: imagem9.jpg
Finalizada a leitura de 32767 bytes para o arquivo: imagem9.jpg
Finalizada a leitura de 65534 bytes para o arquivo: imagem9.jpg
Finalizada a leitura de 98301 bytes para o arquivo: imagem9.jpg
Finalizada a leitura de 131068 bytes para o arquivo: imagem9.jpg
Finalizada a leitura de 163835 bytes para o arquivo: imagem9.jpg
Finalizada a leitura de 196602 bytes para o arquivo: imagem9.jpg
Finalizada a leitura de 218684 bytes para o arquivo: imagem9.jpg
Arquivo criado em disco com sucesso
Tamanho: 218684 bytes para o arquivo: imagem10.jpg
Finalizada a leitura de 32767 bytes para o arquivo: imagem10.jpg
Finalizada a leitura de 65534 bytes para o arquivo: imagem10.jpg
Finalizada a leitura de 98301 bytes para o arquivo: imagem10.jpg
Finalizada a leitura de 131068 bytes para o arquivo: imagem10.jpg
Finalizada a leitura de 163835 bytes para o arquivo: imagem10.jpg
Finalizada a leitura de 196602 bytes para o arquivo: imagem10.jpg
Finalizada a leitura de 218684 bytes para o arquivo: imagem10.jpg
Arquivo criado em disco com sucesso
Tamanho: 218684 bytes para o arquivo: imagem11.jpg
Finalizada a leitura de 32767 bytes para o arquivo: imagem11.jpg
Finalizada a leitura de 65534 bytes para o arquivo: imagem11.jpg
Finalizada a leitura de 98301 bytes para o arquivo: imagem11.jpg
Finalizada a leitura de 131068 bytes para o arquivo: imagem11.jpg
Finalizada a leitura de 163835 bytes para o arquivo: imagem11.jpg
Finalizada a leitura de 196602 bytes para o arquivo: imagem11.jpg
Finalizada a leitura de 218684 bytes para o arquivo: imagem11.jpg
Arquivo criado em disco com sucesso
Tamanho: 218684 bytes para o arquivo: imagem12.jpg
Finalizada a leitura de 32767 bytes para o arquivo: imagem12.jpg
Finalizada a leitura de 65534 bytes para o arquivo: imagem12.jpg
Finalizada a leitura de 98301 bytes para o arquivo: imagem12.jpg
Finalizada a leitura de 131068 bytes para o arquivo: imagem12.jpg
Finalizada a leitura de 163835 bytes para o arquivo: imagem12.jpg
Finalizada a leitura de 196602 bytes para o arquivo: imagem12.jpg
Finalizada a leitura de 218684 bytes para o arquivo: imagem12.jpg
Arquivo criado em disco com sucesso
Tamanho: 218684 bytes para o arquivo: imagem13.jpg
Finalizada a leitura de 32767 bytes para o arquivo: imagem13.jpg
Finalizada a leitura de 65534 bytes para o arquivo: imagem13.jpg
Finalizada a leitura de 98301 bytes para o arquivo: imagem13.jpg
Finalizada a leitura de 131068 bytes para o arquivo: imagem13.jpg
Finalizada a leitura de 163835 bytes para o arquivo: imagem13.jpg
Finalizada a leitura de 196602 bytes para o arquivo: imagem13.jpg
Finalizada a leitura de 218684 bytes para o arquivo: imagem13.jpg
Arquivo criado em disco com sucesso
Tamanho: 218684 bytes para o arquivo: imagem14.jpg
Finalizada a leitura de 32767 bytes para o arquivo: imagem14.jpg
Finalizada a leitura de 65534 bytes para o arquivo: imagem14.jpg
Finalizada a leitura de 98301 bytes para o arquivo: imagem14.jpg
Finalizada a leitura de 131068 bytes para o arquivo: imagem14.jpg
Finalizada a leitura de 163835 bytes para o arquivo: imagem14.jpg
Finalizada a leitura de 196602 bytes para o arquivo: imagem14.jpg
Finalizada a leitura de 218684 bytes para o arquivo: imagem14.jpg
Arquivo criado em disco com sucesso
Tamanho: 218684 bytes para o arquivo: imagem15.jpg
Finalizada a leitura de 32767 bytes para o arquivo: imagem15.jpg
Finalizada a leitura de 65534 bytes para o arquivo: imagem15.jpg
Finalizada a leitura de 98301 bytes para o arquivo: imagem15.jpg
Finalizada a leitura de 131068 bytes para o arquivo: imagem15.jpg
Finalizada a leitura de 163835 bytes para o arquivo: imagem15.jpg
Finalizada a leitura de 196602 bytes para o arquivo: imagem15.jpg
Finalizada a leitura de 218684 bytes para o arquivo: imagem15.jpg
Arquivo criado em disco com sucesso
Tamanho: 218684 bytes para o arquivo: imagem16.jpg
Finalizada a leitura de 32767 bytes para o arquivo: imagem16.jpg
Finalizada a leitura de 65534 bytes para o arquivo: imagem16.jpg
Finalizada a leitura de 98301 bytes para o arquivo: imagem16.jpg
Finalizada a leitura de 131068 bytes para o arquivo: imagem16.jpg
Finalizada a leitura de 163835 bytes para o arquivo: imagem16.jpg
Finalizada a leitura de 196602 bytes para o arquivo: imagem16.jpg
Finalizada a leitura de 218684 bytes para o arquivo: imagem16.jpg
Arquivo criado em disco com sucesso
Tamanho: 218684 bytes para o arquivo: imagem17.jpg
Finalizada a leitura de 32767 bytes para o arquivo: imagem17.jpg
Finalizada a leitura de 65534 bytes para o arquivo: imagem17.jpg
Finalizada a leitura de 98301 bytes para o arquivo: imagem17.jpg
Finalizada a leitura de 131068 bytes para o arquivo: imagem17.jpg
Finalizada a leitura de 163835 bytes para o arquivo: imagem17.jpg
Finalizada a leitura de 196602 bytes para o arquivo: imagem17.jpg
Finalizada a leitura de 218684 bytes para o arquivo: imagem17.jpg
Arquivo criado em disco com sucesso
Tamanho: 218684 bytes para o arquivo: imagem18.jpg
Finalizada a leitura de 32767 bytes para o arquivo: imagem18.jpg
Finalizada a leitura de 65534 bytes para o arquivo: imagem18.jpg
Finalizada a leitura de 98301 bytes para o arquivo: imagem18.jpg
Finalizada a leitura de 131068 bytes para o arquivo: imagem18.jpg
Finalizada a leitura de 163835 bytes para o arquivo: imagem18.jpg
Finalizada a leitura de 196602 bytes para o arquivo: imagem18.jpg
Finalizada a leitura de 218684 bytes para o arquivo: imagem18.jpg
Arquivo criado em disco com sucesso
Tamanho: 1852 bytes para o arquivo: imagem19.jpg
Finalizada a leitura de 1852 bytes para o arquivo: imagem19.jpg
Arquivo criado em disco com sucesso
Tamanho: 1852 bytes para o arquivo: imagem20.jpg
Finalizada a leitura de 1852 bytes para o arquivo: imagem20.jpg
Arquivo criado em disco com sucesso
Tamanho: 1852 bytes para o arquivo: imagem21.jpg
Finalizada a leitura de 1852 bytes para o arquivo: imagem21.jpg
Arquivo criado em disco com sucesso

Procedimento PL/SQL concluído com sucesso.

SQL> exit
Desconectado de Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options


Ao finalizar a execução do procedimento BLOB_TO_FILE, poderemos ver abaixo os arquivos que foram criados no diretório "/tmp"


[oracle@linux tmp]$ ls -lh
total 3,5M
-rw-r--r-- 1 oracle oinstall 1,9K Jan 12 18:37 imagem1.jpg
-rw-r--r-- 1 oracle oinstall 1,9K Jan 12 18:37 imagem2.jpg
-rw-r--r-- 1 oracle oinstall 214K Jan 12 18:37 imagem3.jpg
-rw-r--r-- 1 oracle oinstall 214K Jan 12 18:37 imagem4.jpg
-rw-r--r-- 1 oracle oinstall 214K Jan 12 18:37 imagem5.jpg
-rw-r--r-- 1 oracle oinstall 214K Jan 12 18:37 imagem6.jpg
-rw-r--r-- 1 oracle oinstall 214K Jan 12 18:37 imagem7.jpg
-rw-r--r-- 1 oracle oinstall 214K Jan 12 18:37 imagem8.jpg
-rw-r--r-- 1 oracle oinstall 214K Jan 12 18:37 imagem9.jpg
-rw-r--r-- 1 oracle oinstall 214K Jan 12 18:37 imagem10.jpg
-rw-r--r-- 1 oracle oinstall 214K Jan 12 18:37 imagem11.jpg
-rw-r--r-- 1 oracle oinstall 214K Jan 12 18:37 imagem12.jpg
-rw-r--r-- 1 oracle oinstall 214K Jan 12 18:37 imagem13.jpg
-rw-r--r-- 1 oracle oinstall 214K Jan 12 18:37 imagem14.jpg
-rw-r--r-- 1 oracle oinstall 214K Jan 12 18:37 imagem15.jpg
-rw-r--r-- 1 oracle oinstall 214K Jan 12 18:37 imagem16.jpg
-rw-r--r-- 1 oracle oinstall 214K Jan 12 18:37 imagem17.jpg
-rw-r--r-- 1 oracle oinstall 214K Jan 12 18:37 imagem18.jpg
-rw-r--r-- 1 oracle oinstall 1,9K Jan 12 18:37 imagem19.jpg
-rw-r--r-- 1 oracle oinstall 1,9K Jan 12 18:37 imagem20.jpg
-rw-r--r-- 1 oracle oinstall 1,9K Jan 12 18:37 imagem21.jpg


Abaixo, após abrir o arquivo imagem1.jpg e o arquivo imagem10.jpg em um editor ou visualizador de imagens, poderemos verificar que os mesmos foram salvos em disco de forma consistente, ou seja, são arquivos válidos sem qualquer corrupção em seus dados.






36 comentários:

Unknown disse...

Eduardo, Parabéns pelo post. Sua explicação e exemplos são muitos bons para aprendizado.
Uma dúvida: Utilizei seus exemplos para gravar um arquivo em um campo blob e depois para recuperar este arquivo e salvar em disco novamente.
O primeiro passo, ocorre sem problemas, onde inclusive verifiquei que o tamanho em bytes do arquivo de origem com o arquivo gravado no banco são os mesmos.
Porém ao salvar o campo Blob no disco, o tamanho do arquivo fica diferente e não consigo abrir o mesmo.
Você teria alguma idéia do que pode está corrompendo o arquivo?
Obrigado

Eduardo Legatti disse...

Olá Welington,

Humm... Não saberia lhe informar o motivo de não estar funcionando. Você está realizando testes com arquivos muito grandes? Tente fazer um teste com arquivos menores para ver se o problema ocorre. Se não ocorrer, talvez possa ser algum limite de tamanho que até então eu desconheço.

Qualquer novidade reporte aqui ;-)

Abraços e até mais ...

Eduardo Legatti disse...

Olá Welington,

Realizei alguns testes aqui com um arquivo maior e realmente o arquivo é carregado corretamente, mas ao salvá-lo de volta em disco, o mesmo parece ter seu tamanho truncado e desta forma o tornando inválido. Ao realizar a extração via uma ferramenta gráfica (TOAD), o mesmo é gravado com sucesso no disco.

Em resumo, algo não está funcionando bem nesta procedure :-(

Abraços e até mais ...

Eduardo Legatti disse...

Olá Welington,

Já descobri qual é o problema e estou arrumando ;-)

Abraços e até mais ...

Eduardo Legatti disse...

A stored procedure BLOB_TO_FILE foi corrigida.

Unknown disse...

Eduardo,
Fiz alguns testes com vários arquivos de tamanhos diferentes, inclusive um tinha 100mb, rsrs, acho que ninguém iria anexar uma arquivo destes. A procedure ficou show de bola.
Muito obrigado.

João Gonçalves disse...

Tem como mandar o BLOB_TO_FILE?

O link não está funcionando... Sabe dizer se funciona no MySQL?

Desde já grato.

Eduardo Legatti disse...

Olá João,

Esta stored procedure é específica para o Oracle. Sobre o link, acredito que possa ser um problema temporário de indisponibilidade do site. Se após algum tempo, mesmo assim o link não funcionar, me avise que irei hospedar o arquivo para download em outro serviço na WEB.

Abraços

Legatti

Eduardo Legatti disse...

Olá João,

Disponibilizei o arquivo para outro serviço na WEB

Abraços

Legatti

Unknown disse...

ola Eduardo, estou com um problema parecido tenho um sistema em delphi de imagens, de vez enquando quando um usuario da update na tabela que tem o arquivo image.. o arquivo da imagem (blob) se corrompe e nao abre mais na hora de resgatar no banco, se vc for no banco e olhar pra ele, vc percebe que o arquivo binario dessa imagem foi todo zuado.. nao sei oque está acontecendo, só percebi que vc resolveu alguma coisa desse tipo ai nesse post, me parece que é o mesmo problema meu, esse arquivo de imagem do tipo blob as vezes ele se corrompe e pra resolver o problema eu sempre entro direto no banco e mando a imagem no arquivo blob manual.. ai ela volta a aparecer novamente, estou usando o banco do sql server e delphi... obriagdo.

Eduardo Legatti disse...

Olá Ricardo,

O objetivo deste artigo é demonstrar como salvar o conteúdo de um campo do tipo BLOB (Oracle) para um arquivo em disco utilizando a linguagem PL/SQL do Oracle. O artigo não está relacionado com o Delphi ou com o SQL Server. Recomendo que você tente verificar o motivo do componente no Delphi estar corrompendo a imagem.

Abraços e até mais...

Legatti

Anônimo disse...

Olá Eduardo.
Tentei usar sua stred procedure, mas infelizmente não consegui.

Eu criei uma tabela de teste e deu certo, fiz assim:
CREATE TABLE "RM_QTS"."AAVR_IMAGES"
(
"IMG_ID" NUMBER,
"ICON" BLOB,
CONSTRAINT "PK_IMAGES" PRIMARY KEY ("IMG_ID")ENABLE
)
)

and insert the table:
insert into AAVR_images values( 2, utl_raw.cast_to_raw('SampleWWWWWWWWString'));
insert into AAVR_images values( 3, utl_raw.cast_to_raw('SampleWWWWWWWWString'));
insert into AAVR_images values( 4, utl_raw.cast_to_raw('SampleWWWWWWWWString'));
COMMIT;

execute blob_to_file('EXPDP_HIST01','RM_QTS.AAVR_images','IMG_ID','ICON');

Porém, quando eu uso nas em produção, cujo eu não sei como são insertidos os dados, não retorna resultados.

Fiz um select com DBMS_LOB.GETLENGTH na coluna da tabela. E não retornou valores.
Vc sabe pq isso acontece?

estou tendo o seguinte erro com esta tabela: Invalid LOB locator specified

Eu postei uma duvida no OTN, mas ainda não encontrei a solução:
https://forums.oracle.com/message/11100975#11100975

Eduardo Legatti disse...

Olá Afonso,

O erro ocorre tanto na versão de produção origem (11.2.0.3.0) quanto na versão destino (11.2.0.2.0)? Tente verificar se no ambiente de produção, a coluna foi criada utilizando SECURE FILE LOBS. Pode ser um bug ;-(

Abraços

Legatti

Anônimo disse...

Olá Eduardo,
Eu testei a consulta, e na origem (11.2.0.2.0 - Production) dá certo. Apenas no destino (11.2.0.3.0 - Production) dá errado a consulta. As tabelas foram criadas como BASICFILE.

Eduardo Legatti disse...

Olá Afonso,

No banco de dados (11.2.0.3.0 - Production), você procurou fazer o teste sem usar DBLINK? Caso você não consiga resolver esse problema, talvez tenha que recorrer ao My Oracle Support (Metalink). Se possível, tente montar um ambiente de teste com a versão (11.2.0.3.0) para realizar algumas simulações.

Abraços

Legatti

Anônimo disse...

Olá Eduardo,
Eu não testei sem o DB_Link, vou fazer um ambiente de teste com está versão. Eu abri um chamado no metalink.

Vou passar as informações averiguadas.

Obrigado

Saulo Calmon disse...

Eduardo,

existe alguma maneira de eu salva no c da máquina do usuário ao invés de ser em um directory ?

Eduardo Legatti disse...

Olá Saulo,

Infelizmente ainda não descobri uma maneira de fazer isso com o PL/SQL. Geralmente se consegue isso usando aplicações de terceiros como o TOAD, PL/SQL Developer, etc...

Abraços

Legatti

Saulo Calmon disse...

Muito obrigado pela resposta. A solução ficou muito boa, só lamento não consegui salvar em um diretório local.

Parabéns pelo blogger, muito bom. Até mais.

Unknown disse...

Parabéns pelo blog e pela procedure, me foi muito útil. Grato.

Eduardo Legatti disse...

Olá Maurício,

Obrigado pela visita e pelo comentário! Que bom que foi útil pra você ;-)

Abraços e até mais

Legatti

Micheel disse...

Fala Eduardo, blz?

cara.. estou tentando utilizar o procedimento mas para qualquer tamanho de imagem eu tenho o erro, ORA-20998: BLOB_TO_FILE: ORA-20000: ORU-10027: buffer overflow, limit of 2000 bytes

quando consigo resolver esse erro ele roda o procedimento corretamente, mas os arquivos não se encontram no diretório... o que pode ser?

Eduardo Legatti disse...

Olá Micheel,

Estou achando que é por causa do set serveroutput on. Eu utilizei ele apenas para demonstração. No mais, configure para set serveroutput off ou então configure para set serveroutput on size 1000000

Abraços,

Legatti

Jean Rodrigo disse...

Bom dia Eduardo,
Estou utilizando essa solução para extrair umas imagens de um banco, o processo roda sem problemas, porém o arquivo que cria na pasta é sem extensão e quando tento alterar para .jpg não abre com visualizador de imagens...
saberia dizer o que é?

Eduardo Legatti disse...

Olá Jean,

Você tentou rodar com set "serveroutput on" para ver se realmente está sendo gerado o arquivo? Tem como certificar que o arquivo realmente é uma imagem?

SQL> set serveroutput on
SQL> execute blob_to_file('ARQUIVO_DIR','TAB_IMAGEM','NOME','IMAGEM');

Jean Rodrigo disse...

Opa,
Rodei com o set sim, mostrou:
Finalizada a leitura de 63271 bytes para o arquivo: 18792
Finalizada a leitura de 1 bytes para o arquivo: 18792
Finalizada a leitura de 32001 bytes para o arquivo: 18792
Arquivo criado em disco com sucesso
para cada arquivo criado

eu tenho acesso ao sistema que o banco está conectado e realmente é uma foto sim.

Jean Rodrigo disse...

Verifiquei que está vindo sem extensão pois não existe '.jpg' no valor unico que gera o nome do arquivo, mas teria que abrir quando eu renomeasse para '.jpg'

Jean Rodrigo disse...

Outra coisa para acessar esse banco, me enviaram um backup .dmp e importei este backup para minha maquina local, Verifiquei também que tive que alterar o CHARACTERSET para US7ASCII, pois essas tabelas de imagens não estavam sendo restauradas na linguagem padrão do oracle, após alterar a linguagem, as tabelas foram restauradas e consegui acesso a elas, seria algo relacionado?

Eduardo Legatti disse...

Olá Jean,

Não sei se tem relação com o characterset. Teria como você importar uma imagem qualquer em uma tabela nesse banco e rodar o procedimento de exportação?

Pelo que vi, a saída do arquivo está muito estranha: Começa com 63KB depois 1B e depois mais 32KB.

Finalizada a leitura de 63271 bytes para o arquivo: 18792
Finalizada a leitura de 1 bytes para o arquivo: 18792
Finalizada a leitura de 32001 bytes para o arquivo: 18792

Sendo que o certo seria a leitura dos bytes ser crescente:

Finalizada a leitura de 32767 bytes para o arquivo: imagem8.jpg
Finalizada a leitura de 65534 bytes para o arquivo: imagem8.jpg
Finalizada a leitura de 98301 bytes para o arquivo: imagem8.jpg
Finalizada a leitura de 131068 bytes para o arquivo: imagem8.jpg
Finalizada a leitura de 163835 bytes para o arquivo: imagem8.jpg
Finalizada a leitura de 196602 bytes para o arquivo: imagem8.jpg


Jean Rodrigo disse...

Eduardo,
Fiz isso que falou de importar uma imagem e exportar, importei com o carrega_imagem e exportei, consegui abrir, porem o teste que fiz a imagem é bem menor quanto ao tamanho,sera que nao seria isso? pois o que quero exportar são imagens de webcam são fotos de clientes

Eduardo Legatti disse...

Olá Jean,

Tente importar um arquivo maior e faça o teste novamente.para ter certeza que o problema não é com o tamanho do arquivo. Sobre o banco de dados esses arquivos não estão criptografados?

Jean Rodrigo disse...

Opa Eduardo,
O arquivo maior deu certo, não seria esse o problema.
Criptografados eu acredito que não, porque todos os outros dados do banco eu consigo acessar, a não ser que seja só os dados de imagens do banco, mas questionei o pessoal do sistema sobre isso...

Jean Rodrigo disse...

Bom dia Eduardo, os dados estavam criptografados mesmo, consegui copiar a tabela inteira do oracle para o postgres e verifiquei que havia uma sequencia de caracteres a mais na frente dos dados da coluna, removi esses caracteres e consegui acessar a imagem
Obrigado, excelente sua solução!

Eduardo Legatti disse...

Jóia!!!

Anônimo disse...

Show de bola, me ajudou muito. GRadicido!

robson disse...

Eduardo,

Parabéns, seu post salvou meu dia. Deu tudo Certinho....

Postagens populares