PostgreSQL: Sentencias XML

Este es el Post #17 del Topic: Guía Práctica de PostgreSQL

SUGERENCIA:
Si has utilizado la base de datos dbadmision en ejercicios previos es mejor volver a crearla.
Descargar Script: DBAdmision.sql

En este post me dedicaré a ejemplificar el uso del tipo de dato XML, el uso de las funciones XML y la exportación de consultas hacia XML con PostgreSQL.
La tecnología XML nos ha facilitado constantemente en lograr compatibilidad entre diversos formatos y permitir compartirlos entre distintas aplicaciones y sin duda en bases de datos su funcionalidad debería ser también muy aprovechada.

El esquema que habrá que respetar en el entorno de bases de datos, y en el caso específico de postgres es el siguiente:

<catalogname>
  <schemaname>
    <tablename>
      <row>
        <colname1>value</colname1>
        <colname2 xsi:nil='true'/>
        ...
      </row>
      ...
    </tablename>
    ...
  </schemaname>
  ...
</catalogname>

No voy a entrar al detalle de lo que es XML, tampoco de todas las funciones habidas y por haber sobre el,  sin embargo desarrollaremos una parte importante que nos sacará de apuros en algún momento o situación. Algunas de las funciones brindades por postgres sobre XML que usaremos en este post son:

  • XMLCOMMENT
  • XMLCONCAT
  • XMLELEMENT
  • XMLFOREST
  • XMLAGG
  • QUERY_TO_XML
  • TABLE_TO_XML

Para comprender la funcionalidad de cada uno de ellos creo que más vale una ejecución que mil palabras, ¿hace falta recordar que base de datos usaremos para este ejemplo?.

1- Comprobando algunas funciones XML:

SELECT xmlelement(name Contacto, IDContacto)
FROM Persona.Contacto;
SELECT xmlelement(name Paterno, Paterno),xmlelement(name Materno, Materno)
FROM Persona.Contacto;
SELECT xmlforest(Paterno, Materno)
FROM Persona.Contacto;
SELECT xmlelement(name Contacto, xmlforest(Paterno, Materno))
FROM Persona.Contacto;
SELECT XMLAgg(XMLForest(Paterno, Materno))
FROM Persona.Contacto;
SELECT XMLElement(name Contacto, XMLAgg(XMLForest(Paterno, Materno)))
FROM Persona.Contacto;

2- Creamos una secuencia para usarlo como numeración de la estructura resultante:

--DROP SEQUENCE seq_contacto;
CREATE TEMP SEQUENCE seq_contacto;
SELECT xmlelement(name Contacto
,xmlattributes(nextval('seq_contacto') AS "row")
,xmlforest(Paterno, Materno) )
FROM Persona.Contacto;
SELECT xmlelement(name Contacto, xmlforest(Paterno, Materno, Nombres) )
FROM Persona.Contacto;
SELECT xmlelement(name Persona
,xmlelement(name Contacto
,xmlattributes(IDContacto)
,Paterno
,Materno
,Nombres)
)
FROM Persona.Contacto;

3- Usando xmlcomment para comentar sobre XML

SELECT xmlelement(name Persona
,xmlcomment('Comentario')
,xmlforest(Paterno, Materno,Nombres))
FROM Persona.Contacto;
SELECT xmlelement(name Paterno, Materno)
,xmlelement(name Materno, Materno)
FROM Persona.Contacto;
SELECT xmlconcat(xmlelement(name Paterno, Materno)
,xmlelement(name Nombres, Nombres))
FROM Persona.Contacto;
SELECT xmlelement(name Contacto, xmlconcat( xmlelement(name Paterno, Paterno)
,xmlelement(name Materbo, Materno)))
FROM Persona.Contacto;

4- Creamos una tabla que contenga un campo de tipo XML, veremos luego una manera especial de manipularlas.

--DROP TABLE Persona.ContactoXML;
CREATE TABLE Persona.ContactoXML (col1 XML);
INSERT INTO Persona.ContactoXML(SELECT xmlelement(name Contacto
,xmlconcat( xmlelement(name Paterno, Paterno)
,xmlelement(name Materno, Materno) ) )
FROM Persona.Contacto);
SELECT col1 FROM Persona.ContactoXML;

5- XPATH nos facilitará en la seleccion de campos dentro de una estructura de datos XML:

SELECT xpath('/contacto/materno/text()', col1)
FROM Persona.ContactoXML ;
SELECT xpath('/contacto/paterno/text()', col1)
FROM Persona.ContactoXML ;
SELECT columna[1]
FROM ( SELECT xpath('/contacto/materno/text()', col1) AS columna
FROM Persona.ContactoXML ) AS xmlsource;

6- Mucho ojito a estas dos últimas funciones, su poder radica en que puede generar una completa estructura XML a nivel de consulta o de una tabla completa:

SELECT query_to_xml('SELECT Nombres,Paterno,Materno FROM Persona.Contacto'
,FALSE,FALSE,'Contactos')
SELECT table_to_xml('Persona.Contacto',FALSE,FALSE,'Contactos')

Recursos Utilizados para el desarrollo de este post:
SQLXML-For-Postgres-Developers
XML Document Support
XML and Databases
XML Type

2 thoughts on “PostgreSQL: Sentencias XML

Deja un comentario