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 RPGEn effet les types SQL XML_xxx_FILE permettent cela, ils contiennent un pointeur vers un fichier de l'IFS et permettent :
- La déclaration suivante
D MON_FICHIERXML S SQLTYPE(XML_CLOB_FILE)Génère :
D MON_FICHIERXML DS
D MON_FICHIERXML_NL 10U
D MON_FICHIERXML_DL 10U D MON_FICHIERXML_FO 10U D MON_FICHIERXML_NAME 255A
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-freele 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 :