GENXMLPROD




le but du jeux étant de :

  1. produire du XML à partir de trois fichiers (Tables SQL)
    1. PRODUCTEURS, contient les coordonnées des producteurs de notre base vinicole
    2. VINS, chaque vin est attaché à un producteur (PR_CODE), un producteur peut bien sûr produire plusieurs vins
    3. MA_CAVE, certains de ces vins sont enregistrés dans le fichier MA_CAVE, d'autre non.

  2. Le XML résultat doit être placé dans un fichier prod.xml de l'IFS !

 

Nous utilisons d'abord la syntaxe SQL V7 XMLAGG

 

Première étape, donner la liste des vins d'un producteur

 

Puis un flux XML par producteur

pour simplier l'utilisation de tout cela, nous allons créer une vue


L'astuce consiste ensuite à utiliser la commande QSH et l'utilitaire db2, ce dernier pouvant produire un fichier dans l'IFS.

le script QSH

Rappel sous QSH le caractère | permet de faire travailler une commande avec le résultat fourni par la commande précédente

Supérieur (>) redirige vers un fichier avec effacement, >>, redirige également dans un fichier (ici le même) mais en ajout.

Enfin la commande grep permet d'éliminer les lignes d'entête ajoutées par l'utilitaire db2 , en ne gardant que celles contenant <PRODUCTEUR>

Exécution :



 

Résultat (sous RDP 8.5)

Affichage en mode Source

Affichage en mode Conception (toujours sous RDP)


Nous aurions pu aussi réaliser cette opération en RPG

En effet les types SQL XML_xxx_FILE permettent cela, ils contiennent un pointeur vers un fichier de l'IFS et permettent :


Exemples en RPG (DBCLOB car, par défaut, les champs XML sont en UNICODE) * récupération d'une colonne XML dans une variable du langage *============================================================
 D MON_XML S SQLTYPE(XML_DBCLOB:2500)
D pos S 5i 0
/free
exec sql
select info into :mon_xml from posample/customer
where cid = 1000;
eval pos = %scan(%ucs2('phone') :mon_xml_data); //pos = 260
*inlr = *on;
/end-free * Exportation d'une colonne XML dans un fichier de l'IFS *=======================================================
DMON_FICHIERXML S SQLTYPE(XML_DBCLOB_FILE) /free mon_fichierxml_name = '/temp/xml01.xml'; mon_fichierxml_nl = %len(%trim(mon_fichierxml_name)); mon_fichierxml_fo = SQFOVR;
     exec sql
         select info into :mon_fichierxml from posample/customer
           where cid = 1000;
*inlr = *on; /end-free

le fichier xml01.xml est bien généré dans /temp (CCSID 1208) et contient :

Browse : /temp/xml01.xml 
Record : 1 of 3 by 18 Column : 1 132 by 131
Control :
....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8....+....9....+....0....+....1....+....2....+....3.
************Beginning of data**************
<?xml version="1.0" encoding="UTF-8"?><customerinfo xmlns="http://posample.org" Cid="1000"><name>Kathy Smith</name><addr country="Ca
nada"><street>5 Rosewood</street><city>Toronto</city><prov-state>Ontario</prov-state><pcode-zip>M6W 1E6</pcode-zip></addr><phone typ
e="work">416-555-1358</phone></customerinfo>
************End of Data********************

 

Pour l'exemple qui nous intéresse, le code suivant produit le fichier xml02.xml





Sur le même principe le code suivant remplace Château par Chateau dans le fichier XML



Pour information, à l'inverse, le fichier prod.xml peut être traité par SQL avec la syntaxe suivante :


©AF400