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.
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.
https://eduardolegatti.blogspot.com/2010/01/salvando-o-conteudo-de-um-campo-blob.html?m=1