Pular para o conteúdo

Como converter um XML para JSON em PL/SQL usando as funções do Oracle 19c

Como converter um XML para JSON em PL/SQL usando as funções do Oracle 19c

XML e JSON são dois formatos populares para trocar dados entre sistemas. XML é um formato baseado em marcação que usa tags para definir a estrutura e o conteúdo dos dados. JSON é um formato baseado em texto que usa objetos e arrays para representar os dados. Ambos os formatos são amplamente suportados por várias linguagens de programação e ferramentas.

Mas e se você quiser converter um XML para JSON em PL/SQL? PL/SQL é uma linguagem de programação procedural que é usada para interagir com bancos de dados Oracle. PL/SQL tem suporte nativo para manipular XML, mas não para JSON. Então, como você pode fazer essa conversão de forma eficiente e confiável usando as funções do Oracle 19c?

O Oracle 19c inclui várias melhorias na funcionalidade JSON no banco de dados. Neste artigo, vamos ver algumas dessas funções e como usá-las para converter um XML para JSON em PL/SQL. Vamos usar o seguinte XML como exemplo:

<livro>
  <titulo>O Guia do Mochileiro das Galáxias</titulo>
  <autor>Douglas Adams</autor>
  <ano>1979</ano>
</livro>

Usando a função JSON_OBJECT

A função JSON_OBJECT é uma função SQL que cria um objeto JSON a partir de uma lista de pares chave-valor. Você pode usar essa função em conjunto com as funções xmltable e xmlquery, que permitem extrair dados de um XML usando XPath ou XQuery. Veja um exemplo de uso:

declare
  v_xml xmltype;
  v_json clob;
begin
  -- Cria um XMLType a partir de uma string
  v_xml := xmltype('<livro><titulo>O Guia do Mochileiro das Galáxias</titulo><autor>Douglas Adams</autor><ano>1979</ano></livro>');
  -- Converte o XMLType para um CLOB usando a função json_object e as funções xmltable e xmlquery
  select json_object(
    'livro' value json_object(
      'titulo' value titulo,
      'autor' value autor,
      'ano' value ano
    )
  )
  into v_json
  from xmltable(
    '/livro'
    passing v_xml
    columns
      titulo varchar2(100) path 'titulo',
      autor varchar2(100) path 'autor',
      ano number path 'ano'
  );
  -- Imprime o resultado na saída padrão
  dbms_output.put_line(v_json);
end;
/

O resultado é:

{"livro":{"titulo":"O Guia do Mochileiro das Galáxias","autor":"Douglas Adams","ano":1979}}

Essa função tem a vantagem de ser nativa do Oracle Database, o que significa que você não precisa instalar nenhuma biblioteca externa e que você pode usar a função json_object em qualquer consulta SQL. Além disso, essa função pode ser mais rápida e precisa do que outras opções, pois a conversão é feita diretamente pelo banco de dados, sem a criação de objetos intermediários.

No entanto, essa função também tem algumas desvantagens. Primeiro, você precisa ter a versão 12.2 ou superior do Oracle Database, o que pode não ser o caso de todos os usuários. Segundo, você precisa escrever uma consulta SQL complexa, que pode ser difícil de entender e manter. Terceiro, você precisa conhecer bem a estrutura e o conteúdo do XML, pois você precisa especificar os nomes e os tipos dos elementos e atributos que você quer converter.

Usando a função JSON_SERIALIZE

A função JSON_SERIALIZE é uma função SQL que converte um documento JSON de qualquer tipo de dados suportado para texto. Você pode usar essa função em conjunto com a função json_object, que permite criar um objeto JSON a partir de um XMLType. Veja um exemplo de uso:

declare
  v_xml xmltype;
  v_json clob;
begin
  -- Cria um XMLType a partir de uma string
  v_xml := xmltype('<livro><titulo>O Guia do Mochileiro das Galáxias</titulo><autor>Douglas Adams</autor><ano>1979</ano></livro>');
  -- Converte o XMLType para um CLOB usando a função json_serialize e a função json_object
  select json_serialize(
    json_object(
      'livro' value json_object(
        'titulo' value xmlquery('/livro/titulo/text()' passing v_xml returning content),
        'autor' value xmlquery('/livro/autor/text()' passing v_xml returning content),
        'ano' value xmlquery('/livro/ano/text()' passing v_xml returning content)
      )
    )
  )
  into v_json
  from dual;
  -- Imprime o resultado na saída padrão
  dbms_output.put_line(v_json);
end;
/

O resultado é:

{"livro":{"titulo":"O Guia do Mochileiro das Galáxias","autor":"Douglas Adams","ano":"1979"}}

Essa função tem a vantagem de ser mais simples e flexível do que a função json_object, pois você não precisa usar as funções xmltable e xmlquery para extrair os dados do XML. Você pode usar a função json_object diretamente com um XMLType como parâmetro. Além disso, você pode usar a função json_serialize para formatar o JSON de acordo com as suas preferências, como usar aspas duplas ou simples, indentar ou não, etc.

No entanto, essa função também tem algumas desvantagens. Primeiro, você precisa ter a versão 19c ou superior do Oracle Database, o que pode não ser o caso de todos os usuários. Segundo, você pode ter problemas de performance, pois a função json_serialize pode consumir mais recursos do que a função json_object. Terceiro, você pode ter problemas de precisão, pois a função json_serialize pode perder ou alterar alguns dados do XML original, dependendo do tipo de dados e do formato do JSON.

Usando a função JSON_MERGEPATCH

A função JSON_MERGEPATCH é uma função SQL que permite atualizar partes de um documento JSON em operações de seleção e atualização. Você pode usar essa função para converter um XML para JSON de forma incremental, adicionando ou modificando os pares chave-valor conforme necessário. Veja um exemplo de uso:

declare
  v_xml xmltype;
  v_json clob;
begin
  -- Cria um XMLType a partir de uma string
  v_xml := xmltype('<livro><titulo>O Guia do Mochileiro das Galáxias</titulo><autor>Douglas Adams</autor><ano>1979</ano></livro>');
  -- Cria um CLOB vazio
  v_json := empty_clob();
  -- Converte o XMLType para um CLOB usando a função json_mergepatch
  select json_mergepatch(
    json_mergepatch(
      json_mergepatch(
        v_json,
        json_object('livro' value json_object())
      ),
      json_object('livro.titulo' value xmlquery('/livro/titulo/text()' passing v_xml returning content))
    ),
    json_object('livro.autor' value xmlquery('/livro/autor/text()' passing v_xml returning content), 'livro.ano' value xmlquery('/livro/ano/text()' passing v_xml returning content))
  )
  into v_json
  from dual;
  -- Imprime o resultado na saída padrão
  dbms_output.put_line(v_json);
end;
/

O resultado é:

{"livro":{"titulo":"O Guia do Mochileiro das Galáxias","autor":"Douglas Adams","ano":"1979"}}

Essa função tem a vantagem de ser mais dinâmica e declarativa do que as outras funções, pois você pode atualizar o JSON de forma incremental, adicionando ou modificando os pares chave-valor conforme necessário. Você pode usar a notação de ponto para acessar os campos do objeto JSON. Além disso, você pode usar a função json_mergepatch para atualizar o JSON em operações de atualização, sem precisar recriar o JSON inteiro.

No entanto, essa função também tem algumas desvantagens. Primeiro, você precisa ter a versão 19c ou superior do Oracle Database, o que pode não ser o caso de todos os usuários. Segundo, você precisa escrever várias chamadas da função json_mergepatch, que podem ser repetitivas e confusas. Terceiro, você precisa conhecer bem a estrutura e o conteúdo do XML e do JSON, pois você precisa especificar os caminhos e os valores que você quer atualizar.

Conclusão

Neste artigo, vimos como converter um XML para JSON em PL/SQL usando as funções do Oracle 19c. Vimos três funções possíveis: json_object, json_serialize e json_mergepatch. Cada função tem suas vantagens e desvantagens.

Caso queira ter acesso a outras maneiras de se converter os arquivos XML, CLIQUE AQUI e veja o meu artigo anterior.

Valeuuuuu !

Referências

Natanael Freitas

Natanael Freitas

E aí, pessoal! Sou o Natanael Freitas, o cara que curte desbravar o mundo do PL/SQL. Não sou nenhum expert, mas me viro bem nas linhas de código desse universo. A verdade é que sou mais íntimo de bancos de dados do que de muitas pessoas por aí – sério! Quando não tô quebrando a cabeça com triggers e stored procedures, tô por aí fuçando a web em busca de tudo que é novidade nesse mundão tech. Às vezes, me pego dando uma aula rápida sobre PL/SQL pros colegas, na tentativa de descomplicar essa coisa toda. Meu dia a dia é basicamente sorrisos, café (sim, sou desses que não larga a caneca!) e resolvendo problemas nos códigos. Não sou nenhum Picasso, mas acho que consigo fazer umas artes por aí. Então, se precisar de ajuda com PL/SQL ou só quiser bater um papo sobre o assunto, tamo aí!

Deixe um comentário

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

plugins premium WordPress