Pular para o conteúdo

Como salvar o conteúdo de um campo BLOB para um arquivo em disco

Salvando o conteúdo de um campo BLOB para um arquivo em disco (BLOB_TO_FILE)

Olá,

No artigo Um pouco do pacote UTL_FILE, DBMS_LOB e objeto DIRECTORY, 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 “Um pouco do pacote UTL_FILE, DBMS_LOB e objeto DIRECTORY”.

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.

Eduardo Legatti

Eduardo Legatti

Eduardo Legatti é Analista de Sistemas e Administrador de banco de dados. É pós graduado em Gerência da Tecnologia da Informação, possui as certificações OCA 9i - OCP 9i/10g/11g – OCE SQL Expert, e vem trabalhando como DBA Oracle desde a versão 8.0.5. Se interessa particularmente em planejar estratégias de backup/recovery, performance tuning e projetos de bancos de dados (modelagem física e lógica) atuando como consultor. Como Oracle ACE, ele tem o hábito de disseminar seu conhecimento através de artigos, grupos de discussão (Oracle OTN Forums) e dedica-se a compartilhar informações de forma a motivar novos DBAs.

Comentário(s) da Comunidade

  1. Olá Eduardo Legatti, não consegui ver sua procedure BLOB_TO_FILE, estou procurando uma forma fazer donwloads de arquivos talvez ela me ajudaria com alguma ideia. Se puder ajudar.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Marcações:
plugins premium WordPress