SELECT 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
amarorafael
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 44
Registrado em: Qua, 14 Mar 2012 2:37 pm

BOA TARDE,
Sou iniciante com PL/SQL e tenho a seguinte dúvida:
eu preciso fazer uma manipulação em uma tabela que tem um campo clob,
dentro desse campo contém um código xml no qual eu tenho que extrair parte de desse código (um bloco pra
ser mais específico) e jogar esse bloco num código html.
A questão é: como eu não conheço muito de manipulação de clob's, como eu faria essa extração?!
desde já obrigado!
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Oi Amarorafael,

Não sou especialista em XML e CLOB, mas encontrei um ótimo exemplo no site ASKTOM (http://asktom.oracle.com), especificamente neste LINK:

http://asktom.oracle.com/pls/apex/f?p=1 ... 5019878716

Na opinião de Tom Kyte (o criador do ASKTOM), campos CLOB não são muito recomendados para se armazenar código XML. Na falta de uma opção melhor, você pode se basear no exemplo que ele colocou no LINK acima. O método usado por ele para extrair a informação XML do campo CLOB é o XMLTYPE(..).EXTRACT:

Selecionar tudo

Here is a temporary solution -- long term, use the right type for the data:

ops$tkyte@ORA920LAP> create table t ( x clob );
Table created.

ops$tkyte@ORA920LAP>
ops$tkyte@ORA920LAP> insert into t values (
  2  '<REQUEST_DETAIL>
  3    <GROUP_TYPE>PR</GROUP_TYPE>
  4    <GROUP_NAME>DATA ENGINEERING ASSET MANAGEMENT</GROUP_NAME>
  5    <BUS_UNIT_ACRN>SCS-FCAT</BUS_UNIT_ACRN>
  6    <PROJ_MGR_ID></PROJ_MGR_ID>
  7    <PROJ_MGR_NAME>Roland Roy</PROJ_MGR_NAME>
  8   </REQUEST_DETAIL>' );
1 row created.

ops$tkyte@ORA920LAP>
ops$tkyte@ORA920LAP> select 
e.x.extract('/REQUEST_DETAIL/GROUP_TYPE/text()').getStringVal()
  2    from t e
  3  /
select e.x.extract('/REQUEST_DETAIL/GROUP_TYPE/text()').getStringVal()
           *
ERROR at line 1: ORA-22806: not an object or REF

ops$tkyte@ORA920LAP> select 
xmltype(e.x).extract('/REQUEST_DETAIL/GROUP_TYPE/text()').getStringVal()
  2    from t e
  3  /

XMLTYPE(E.X).EXTRACT('/REQUEST_DETAIL/GROUP_TYPE/TEXT()').GETSTRINGVAL()
------------------------------------------------------------------------
PR

O site do ASKTOM é excelente para se aprender PL/SQL em detalhes, pois o Tom Kyte sempre baseia suas explicações em exemplos que você mesmo pode reproduzir depois em seu ambiente.

Espero que a explicação do ASKTOM seja suficiente para esclarecer suas dúvidas. Pode ser que os foristas do GLUFKE possam lhe apresentar outras sugestões.

Boa sorte,

Sergio Coutinho
amarorafael
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 44
Registrado em: Qua, 14 Mar 2012 2:37 pm

perfeito ! consegui retirar um bloco de um xml que esta em um clob usando basicamente esse recurso, então eu montei o seguinte select :

Selecionar tudo

SELECT 
       extract(XMLType(coluna_da_tabela), 'bloco_xml', 'xmlns="endereco"')
  FROM tabela
 WHERE condicao 
e deu certo!
só que agora eu estou em um outro dilema, eu tenho que acrescentar esse trecho do xml que eu retirei e armazena-lo em um cod html (dentro de um text area) e inserir este cod htm em uma coluna do tipo clob da tabela. o Código html é este:

Selecionar tudo

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<form  method="post">
<input type="submit" value="enviar">
        <textarea name="arquivoXml" cols="150" rows="50" style="visibility:hidden" >
TRECHO XML DEVE VIR AQUI!!!!!!
           </textarea>
   </form>
<script>

document.one.submit();
      </script>
   </body>
</html>

Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Ola amaro,

Não saberia exatamente como sugerir uma solução definitiva, mas você pode tentar armazenar este código HTML em um campo VARCHAR2(4000) e tentar usar as funções de busca e substituição em strings, como INSTR e REPLACE.

Talvez o pessoal possa dar alguma outra dica sobre este tema.

Abraços,

Sergio Coutinho
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Tem um pequeno problema... HTML não é igual XML, e é muito mais complexo para fazer o parse, então você não tem como usar as funções de XML do Oracle para te ajudar lá.

Você provavelmente terá que fazer como o STCOUTINHO falou, criar um VARCHAR2 e tratar com função de manipulação de string, INSTR, SUBSTR etc, localizar o início da sua tag:

Selecionar tudo

<textarea name="arquivoXml" cols="150" rows="50" style="visibility:hidden" >
garantir que não tenha outros tags textarea dentro dela aninhados, verificar a consistência e procurar pelo fim da tag e inserir no meio o XML.

Pode ser até 32767 de comprimento em PL/SQL. Em SQL é 4000 o máximo do VARCHAR2.

Detalhe, a função Extract é uma função deprecada e a Oracle recomenda utilizar a função XMLQUERY:
http://docs.oracle.com/cd/E11882_01/ser ... ons060.htm

http://docs.oracle.com/cd/E11882_01/app ... b13gen.htm
amarorafael
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 44
Registrado em: Qua, 14 Mar 2012 2:37 pm

Será que você poderia me dar um exemplo de como eu irei fazer essas manipulações?!
sou novo na área e não estou conseguindo realizar aqui!
se puder ficarei grato!
Responder
  • Informação
  • Quem está online

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