Para melhor visualização, recomendo resolução de no mínimo 1024 x 768 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.




Google+

21 comentários:

Welington 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.

Welington 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

Ricardo Farias FArias 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

Afonso Rodrigues 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

Afonso Rodrigues 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

Afonso Rodrigues 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.

Maurício Leao 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

Postagens populares