XMLTable

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
lmendes.cps
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 13
Registrado em: Seg, 20 Jun 2011 2:14 pm
Localização: Campinas - SP

Amigos, boa tarde.

Não tenho muita experiência na manipulação de XML, mas preciso resolver um problema de um cliente. Pesquisando na internet, vi que tenho que usar o XMLTABLE...

Tenho um xml, da seguinte forma:

Selecionar tudo

<Dados>
  <Materiais>
    <Material Quantidade="3" Aplicacao="1" Grupo="19" Subgrupo="48" Codigo="40" Equipe="0" Novo="True" Bop_Executante="2289">
      <PontosUtilizacao>
      <PontoUtilizacao>
        <IDPoste1>24242665</IDPoste1>
        <Quantidade>1</Quantidade>
      </PontoUtilizacao>
      <PontoUtilizacao>
        <IDPoste1>24242767</IDPoste1>
        <Quantidade>1</Quantidade>
      </PontoUtilizacao>
      <PontoUtilizacao>
        <IDPoste1>24242891</IDPoste1>
        <Quantidade>1</Quantidade>
      </PontoUtilizacao>
      </PontosUtilizacao>
    </Material>
    <Material Quantidade="3" Aplicacao="1" Grupo="6" Subgrupo="76" Codigo="207" Equipe="0" Novo="True" Bop_Executante="2289">
      <PontosUtilizacao />
    </Material>
  </Materiais>
</Dados>
Preciso criar um SELECT para extrair os postes por material. Ilustrando, preciso da seguinte informação:
------------------------------------------------------------------
cod. material poste
------------------------------------------------------------------
40 24242665
40 24242891
40 24242767
------------------------------------------------------------------

Criei uma tabela para importar o XML para uma tabela:

Selecionar tudo

 CREATE TABLE tst_xmltable (id_xml NUMBER, xml XMLType); 


Criação do directory:

Selecionar tudo

 create or replace directory xmldir as '/home/oracle/temp';



Insert:

Selecionar tudo

 insert into tst_xmltable(id_xml, xml) values (1, xmltype(bfilename('XMLDIR','teste_xml.xml'), nls_charset_id('AL32UTF8')) );



Até aqui, ok.

O select para extrair as informações, tentei da seguinte maneira:

Selecionar tudo

 SELECT m.icodigo, m.sposte
  FROM tst_xmltable x,
       XMLTABLE('/Dados/Materiais/Material' 
                PASSING x.xml
                COLUMNS icodigo   number(3)    path '@Codigo',
                        sposte    varchar2(20) path '/PontosUtilizacao/PontoUtilizacao/IDPoste1') m
WHERE x.id_xml = 3;  



Porém não tive um resultado positivo, pois só me lista os codigos dos materiais, o poste vem em branco.

Gostaria se possivel que alguém me ajudasse... vou continuar tentanto, qualquer novidade posto aqui.

Abraço!
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

veja se da certo com isso:

http://download.oracle.com/docs/cd/B283 ... ons054.htm

EXTRACTVALUE

;)
lmendes.cps
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 13
Registrado em: Seg, 20 Jun 2011 2:14 pm
Localização: Campinas - SP

Amigo, já tinha tentado o extractvalue. O problema é que este retorna apenas um nó... e não me ajuda.
lmendes.cps
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 13
Registrado em: Seg, 20 Jun 2011 2:14 pm
Localização: Campinas - SP

Amigos,

Encontrei uma solução, segue:

Selecionar tudo

while sxml.existsNode('/Dados/Materiais/Material[' || v_count || ']') = 1 loop
      dbms_output.put_line(sxml.extract('/Dados/Materiais/Material[' || v_count || ']/@Codigo').getStringVal());
      while sxml.existsNode('/Dados/Materiais/Material[' || v_count || ']/PontosUtilizacao/PontoUtilizacao[' || icont || ']') = 1 loop
          dbms_output.put_line(sxml.extract('/Dados/Materiais/Material[' || v_count || ']/PontosUtilizacao/PontoUtilizacao[' || icont || ']/IDPoste1').getStringVal()); 
          icont := icont + 1;
      end loop;
      icont := 1;
      v_count := v_count + 1;
  end loop;
Responder
  • Informação
  • Quem está online

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