Converter Blob para Clob

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Valtie
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Qui, 29 Out 2009 4:29 pm
Localização: SP
Valter Nazario

Boa tarde,

No pl sql 8.0, tem um campo "BLOB" que quando abro, as informações ficam em formato hexadecimal.
Alguém sabe como faço para alterar para formato texto? :lol:
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

bom..

eu acho q a função HEXTORAW pode te ajudar mas se não conseguir da uma olhada aqui
Editado pela última vez por victorhugomuniz em Qui, 29 Out 2009 6:50 pm, em um total de 1 vez.
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Acredito possa usar o pacote DBMS_LOB, com o procedimento:

dbms_lob.convertToClob,

att
Valtie
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Qui, 29 Out 2009 4:29 pm
Localização: SP
Valter Nazario

O campo BLOB é um campo binario, ele pode armazenar varios tipos de arquivos.
As ferramentas como o sqlplus , pl/sql developer e etc, não retornam seus valores em caracter.
O usuário tem recursos de programação na sua aplicação os quais conseguem retornar o respectivo conteudo da coluna blob.
Caso o usuário seja um desenvolvedor informe a ele, que existem packages em pl/sql(DBMS_LOB.CONVERTTOCLOB) que convertem o conteúdo de uma coluna blob para clob.

Acredito possa usar o pacote DBMS_LOB, com o procedimento:

Selecionar tudo

dbms_lob.convertToClob


Bom dia,

Obrigado pelas dicas.
Mas a dúvida continua, rrssss....
Eu trabalho na parte de suporte a usuários, mais voltado para infra-estrutura. Eu atualizei a versão do Pl/Sql para um usuário e ele está com está dúvida para converter hexadecimal para texto, BLOB para CLOB.
Eu gostaria de saber se alguém poderia me passar este passo-a-passo, para realizar esta conversão?

:?: :roll:
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Primeiro, você deve ter CERTEZA que o campo blob contém apenas texto. Se não, é impossível converter isso sem ser para hexa.

Imagina você ter uma imagem JPG armazenada nesse campo. Qual é o motivo de converter isso pra TEXTO ?

Eu achei o seguinte código numa discussão na OTN. Veja se resolve:

Selecionar tudo

l_blob blob;
l_clob clob := 'x';
l_dest_offsset integer := 1;
l_src_offsset integer := 1;
l_lang_context integer := dbms_lob.default_lang_ctx;
l_warning integer;

BEGIN
--
SELECT bat.data_file
INTO l_blob
FROM batches bat
WHERE bat.id = p_to_id
;
dbms_lob.converttoclob
( dest_lob => l_clob
, src_blob => l_blob
, amount => dbms_lob.lobmaxsize
, dest_offset => l_dest_offsset
, src_offset => l_src_offsset
, blob_csid => dbms_lob.default_csid
, lang_context => l_lang_context
, warning => l_warning
);
--
UPDATE batches
SET clob_data = l_clob
WHERE id = p_to_id

END;
Editado pela última vez por dr_gori em Sex, 30 Out 2009 9:01 am, em um total de 1 vez.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Aqui tem outro exemplo

Selecionar tudo

  FUNCTION b2c( b IN BLOB )
      RETURN CLOB
       -- typecasts BLOB to CLOB (binary conversion)
       IS
      pos       PLS_INTEGER  := 1;
      buffer    VARCHAR2( 32767 );
      res       CLOB;
      lob_len   PLS_INTEGER  := DBMS_LOB.getLength( b );
       BEGIN
      DBMS_LOB.createTemporary( res, TRUE );
      DBMS_LOB.OPEN( res, DBMS_LOB.LOB_ReadWrite );
     
      LOOP
        buffer := UTL_RAW.cast_to_varchar2( DBMS_LOB.SUBSTR( b, 16000, pos ) );
     
        IF LENGTH( buffer ) > 0 THEN
       DBMS_LOB.writeAppend( res, LENGTH( buffer ), buffer );
        END IF;
     
        pos := pos + 16000;
        EXIT WHEN pos > lob_len;
      END LOOP;
     
      RETURN res; -- res is OPEN here
      END b2c;
Valtie
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Qui, 29 Out 2009 4:29 pm
Localização: SP
Valter Nazario

Obrigadão pelas dicas. :D
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 17 visitantes