«

»

fév 27

Imprimer ceci Article

Du SQL DB2 au XML

Il n y a qu’un pas !

Il s’agit ici de générer du XML sur base d’un select sur une table en SQL.

Requête de base :

select
XMLElement( name "root", ma_colonne)
FROM ma_lib . ma_table
Fetch First 1 Rows only;

Structure d’utilisation de XMLElement :

>>-XMLELEMENT--(--NAME--element-name---------------------------->

>--+------------------------------+----------------------------->
   '-,--xmlnamespaces-declaration-'   

>--+---------------------------+-------------------------------->
   '-,--xmlattributes-function-'   

>--+-----------------------------------+------------------------>
   | .-------------------------------. |   
   | V                               | |   
   '---,--element-content-expression-+-'   

>--+----------------------------------------------------------+-->
   |             .------------------------------------------. |   
   |        (1)  V   .-EMPTY ON NULL-. (2)              (3) | |   
   '-OPTION--------+-+-NULL ON NULL--+----------------+-----+-'   
                   |              .-USING-.           |           
                   | .-XMLBINARY--+-------+--BASE64-. |           
                   | |            .-USING-.         | |           
                   '-+-XMLBINARY--+-------+--HEX----+-'           

>--)-----------------------------------------------------------><

Important!

Option intéressante dans le cas de valeur manquante (left / right outer join)

  • EMPTY ON NULL
  • NULL ON NULL

Dans le contenu de la balise, rien n’interdit de mettre une constante, numérique ou pas à la place de la valeur d’une colonne.

Et le contenu peut également être un autre XMLElement :
SELECT
XMLElement( name "home", 1),
XMLElement( name "niveauUn", 'La suite'),
XMLElement( name "N2",

____XMLElement( name "niveauTrois", ma_colonne)
)
FROM ma_lib . ma_table
Fetch First 1 Rows only;

 

<home>1</home>
<niveauUn>La suite</niveauUn>
<N2><niveauTrois>1</niveauTrois></N2>

XMLForest

C’est kif-kif, la syntaxe est plus sympa, mais son utilisation dépendra de la gestion des NULL.

Imaginons un select .. left join qui nous donne en première colonne un numéro (col1) et NULL dans la seconde colonne (col2) :

SELECT
XMLForest(col1 AS "C1"),
XMLForest(col2 AS "Cnull"),
XMLElement( name "Cvide" , col2)
from ...

 

<C1>1</C1>
-
<Cvide/>

Le XmlElement retourne la balise vide : <CVide/>

Présentation en Row

Précédemment, le résultat se présentait sur plusieurs colonnes, voici un exemple de présentation en 1 colonne sur plusieurs lignes :

SELECT '' as "result" FROM ma_lib.TableOneRow
UNION
SELECT xmlserialize ( xmlelement(name "SectionListName", 'TEST') as clob ) as "result" FROM ma_lib.TableOneRow
UNION
SELECT '' as "result" FROM ma_lib.TableOneRow;

TableOneRow est une table ne contenant qu’une colonne et qu’une ligne.

Le XmlSerialize permet de caster le xml pour pouvoir faire l’union entre tous les résultats.

 

<SectionLists><SectionList>
<SectionListName>TEST</SectionListName>
<SectionListItems>

 

Un attribut pour la route ?

XmlElement(name "List",
____XmlElement(name "Item",
________XmlAttributes('0' as "index"), '')
) ,

:
maKyo

Lien Permanent pour cet article : http://ma-kyo.com/sql-db2-xml/