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:
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
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 ...
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 ...
Olá Welington,
Já descobri qual é o problema e estou arrumando ;-)
Abraços e até mais ...
A stored procedure BLOB_TO_FILE foi corrigida.
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.
Tem como mandar o BLOB_TO_FILE?
O link não está funcionando... Sabe dizer se funciona no MySQL?
Desde já grato.
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
Olá João,
Disponibilizei o arquivo para outro serviço na WEB
Abraços
Legatti
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.
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
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
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
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.
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
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
Eduardo,
existe alguma maneira de eu salva no c da máquina do usuário ao invés de ser em um directory ?
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
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.
Parabéns pelo blog e pela procedure, me foi muito útil. Grato.
Olá Maurício,
Obrigado pela visita e pelo comentário! Que bom que foi útil pra você ;-)
Abraços e até mais
Legatti
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?
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
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 é?
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');
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.
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'
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?
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
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
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?
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...
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!
Jóia!!!
Show de bola, me ajudou muito. GRadicido!
Eduardo,
Parabéns, seu post salvou meu dia. Deu tudo Certinho....
Postar um comentário