Manipulando campo XML – Oracle 11gR2

Olá PessoALL!!

Recebi um comentário aqui no site de um leitor perguntando sobre manipulação de XML no Oracle.

Ele estava com dificuldades para fazer, bem como para encontrar fontes claras de como realizar esta manipulação.

Com base nisso, resolvi dar uma pesquisada a respeito, e construir um post para ajudá-lo, seguindo nosso “Padrão Dia a dia Oracle de simplicidade”, então vamos lá.

 

1 – Criando a tabela com campo XML

Para manipulação de XML, nas tabelas que vão armazenar os conteúdos já existe um tipo de dados específico para este fim. É o tipo “xmltype”.

Observe abaixo o exemplo de como criar a tabela com um campo deste tipo:



create table t_xml (xml xmltype);

 

2 – Inserindo os dados na tabela com o XML

Para inserção dos dados, mais uma novidade. Existe uma function chamada “XMLType” que “formata” o XML para ser inserido no banco de dados como deve ser. Ele já tem todo tratamento, e inclusive verifica o padrão XML que está sendo inserido, caso tenha algo errado, alguma tag não fechada ou algo semelhante, dá erro na hora do insert, como este abaixo, em que não fechei a tag cliente:



Erro a partir da linha : 5 no comando -
insert into t_xml (xml) values ( XMLType('<cliente><nome>Joao de Souza</nome><dtnasc>01/01/1981</dtnasc><valorcredito>4000</valorcredito>'))
Relatório de erros -
Erro de SQL: ORA-31061: erro de XDB: XML event error
ORA-19202: Ocorreu um erro no processamento XMLLPX-00007: encontrado fim de arquivo inesperado

3 – Fazendo select no campo XML

Para recuperar as informações de um campo XML também tem uma forma específica de fazer. Para este fim, é necessário utilizar uma função chamada “extractValue”. Com ela você consegue informar que tipo de informação do XML deseja retornar, independente do nível de hierarquia do seu XML. A hierarquia é passada de forma semelhante a uma estrutura de diretório, por exemplo, para retornar a data de nascimento do cliente, que está na tag <dtnasc></dtnasc> usamos da seguinte forma: extractValue(xml, ‘/cliente/dtnasc’), abaixo temos o script completo já executado, criando tabela, inserindo os dados e em seguida realizando o select.

 

4 – Script completo executado com create, insert e select



SQL> create table t_xml (xml xmltype);

Table created.

SQL> insert into t_xml (xml) values ( XMLType('<cliente><nome>Joao de Souza</nome><dtnasc>01/01/1981</dtnasc><valorcredito>4000</valorcredito></cliente>'));

1 row created.

SQL>insert into t_xml (xml) values ( XMLType('<cliente><nome>Zefanias Mobiua</nome><dtnasc>01/10/1980</dtnasc><valorcredito>1100</valorcredito></cliente>'));

1 row created.

SQL> insert into t_xml (xml) values ( XMLType('<cliente><nome>Maria da Silva</nome><dtnasc>05/05/1977</dtnasc><valorcredito>5000</valorcredito></cliente>'));

1 row created.


SQL> insert into t_xml (xml) values ( XMLType('<cliente><nome>Joao de Souza</nome><dtnasc>01/01/1981</dtnasc><valorcredito>4000</valorcredito></cliente>'));


1 row created.


SQL> commit;


Commit complete.


SQL> col nome format a30
SQL> col dtnasc format a15
SQL> col valorcredito format a10
SQL> select extractValue(xml, '/cliente/nome') nome,
extractValue(xml, '/cliente/dtnasc') dtnasc,
extractValue(xml, '/cliente/valorcredito') valorcredito
from t_xml 2 3 4 ;
NOME                           DTNASC          VALORCREDITO
------------------------------ --------------- ------------
Gerson Junior                  12/12/1986              1000
Zefanias Mobiua                01/10/1980              1100
Maria da Silva                 05/05/1977              5000
Joao de Souza                  01/01/1981              4000
SQL>

 

É isso então pessoal, espero que este post contribua para seu Dia a Dia Oracle!

 

Agradecimento:

Leitor Zefanias Mobiua que sugeriu o tópico com sua dúvida!

 

Fontes:

http://docs.oracle.com/cd/B19306_01/appdev.102/b14259/xdb03usg.htm#BABDGDJG

http://docs.oracle.com/cd/E11882_01/appdev.112/e23094/xdb04cre.htm#ADXDB0400

http://oracle-base.com/articles/9i/xmltype-datatype.php

http://www.oracle.com/technetwork/database-features/xmldb/overview/oracle-xmldb-11gr2-1974916.html

 

Abraços!!

 

Gerson Júnior

gerson.vasconcelos@gmail.com

 

5 ideias sobre “Manipulando campo XML – Oracle 11gR2

  1. Zefanias Mobiua

    Gerson,

    Fiquei eslarecido e consegui ultrapassar a dificuldade,

    Porem, a insercao nao consegui fazer com o comando: insert into t_xml (xml) values ( XMLType(‘Zefanias Mobiua01/10/19801100’));
    e sim consegui com o comando insert into t_xml (xml) values ( XMLType(‘Zefanias Mobiua0101/01/198050’));

    obrigado

    Responder
    1. oracle Autor do post

      Zefanias,

      Ocorreu algum erro com o WordPress aqui do site, e ele ocultou todas as tag´s que eu coloquei nos comandos de Insert! Por isso não apareceu e deu erro no seu insert.

      Verifica novamente o post que agora está correto!!

      Peço desculpas.

      Abraços!

      Responder
  2. Zefanias Mobiua

    No seguimento do meu interesse em manipulacao de xml, com o seu exemplo consegui entender e repliquei com sucesso, porem na pratica tenho um xml real onde pretendo extrair dados, e nao consigo relacionar o nivel de hierarquia porque aqui ao inves de usar nomes, usamos propriedades, como faço para extrair os valores: 012111111121000010000G000000000NP201400006 e 888888888888000000000122002 do xml abaixo:

    05-01-2014

    105022

    1388887772241

    MZN

    MT – Metical

    012111111121000010000G000000000NP201400006

    9999990000G000000000

    ZMOB PROVINCIA DE XXXXX

    8.1.1.1.0.00

    C

    888888888888000000000122002

    98.986.810,00

    000000000 – root em 05-01-2014 04:29:12

    e-Learning

    101

    Previsão Inicial da Receita Batch

    8888800022

    Duvida ZMOB

    Responder
    1. oracle Autor do post

      Zefanias.
      Bom dia!!
      O XML aqui veio meio bagunçado, sem as tag´s, o WordPress faz isso por nós! Mas, pelo e-mail que me mandou chegou correto.

      Para este caso, filtrando uma propriedade da tag, Assim deve funcionar: extractvalue(xml, ‘/java/object/void[@property=”documentCode”]/string’)
      Só precisará ter cuidado com atributo “transactionCode”, pois este não tem a tag “string”, portanto, para ele, precisa passar como “int”, assim:

      extractvalue(xml, ‘/java/object/void[@property=”transactionCode”]/int’)

      Espero que lhe seja útil!!

      Grande abraço.

      Gerson Júnior
      gerson.vasconcelos@gmail.com

      Responder

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *