DB2 XML Extender

 

IBM propose une extension à DB2 : DB2 XML Extender.

 

Vous devez installer 5722DE1 *BASE et option 2, ainsi que 5733XT1 (le XML ToolKit) *BASE et option 7

Ensuite, commencez par "activer" la base de données pour xml, par

call QDBXM/QZXMADM PARM(enable_db dbname) ou dbname est le nom entré dans la commande WRKRDBDIRE

cela va créer :

•la bibliothèque DB2XML

•les types de données (UDT), les fonctions (UDF) et les procédures cataloguées propres à DB2 XML Extender

•la table DTD_REF qui contient chaque DTD connue

•la table XML_USAGE qui contient les informations de mappage entre les tables et le flux XML (fichiers DAD)


Vous aurez ensuite, le choix entre deux manières de faire :

  1. XMLcolumn

    A choisir, quand :

    —> les documents XML existent ou viennent d'une autre source et que vous préférez les stocker dans ce format, à l'identique.

    —> les documents XML sont lus fréquemment, mais peu modifiés

  2. XMLcollection

    A choisir quand :

    —> vous avez des données à transformer en XML ou du XML à importer dans votre base de données

    —> ce sont les données stockées qui vous importe, pas le flux XML

stockage du flux XML dans une zone base de données.

par exemple :

alter table XMLSCHEMA.sales_tab add column "ORDER" db2xml.xmlvarchar

DB2 propose ainsi les types


Vous pouvez pour ces types :

 

Pour cela, vous devez :

1/ Enregistrer la DTD du XML par :

insert into db2xml.DTD_REF values('/repertoire/dtd/madtd.dtd', db2xml.XMLClobFromFile('/repertoire/dtd/madtd.dtd'),
0, 'user1', 'user1', 'user1');

2/ Créer un fichier DAD pour la colonne XML

<?xml version="1.0"?> 
<!DOCTYPE DAD SYSTEM "/repertoire/dtd/dad.dtd"> 
<DAD> 
 <dtdid>/repertoire/dtd/madtd.dtd</dtdid> 
 <validation>YES</validation> 
 <Xcolumn> 
   <table name="order_side_tab"> 
    <column name="order_key" type="integer" path="/Order/@key" multi_occurrence="NO"/>  
    <column name="customer" type="varchar(50)" path="/Order/Customer/Name" multi_occurrence="NO"/> 
   </table> 
   <table name="part_side_tab"> 
    <column name="price" type="decimal(10,2)" path="/Order/Part/ExtendedPrice" multi_occurrence="YES"/> 
   </table> 
   <table name="ship_side_tab"> 
    <column name="date" type="DATE" path="/Order/Part/Shipment/ShipDate" multi_occurrence="YES"/> 
   </table>
  </Xcolumn> 
       
</DAD> 

validation à YES, implique que la DTD soit vérifiée à chaque insertion

Xcolumn indique un mappage automatique entre les informations et des tables crées par XML Extender.

3/ Ensuite rendez cette colonne "active" pour XML extender par

CALL QDBXM/QZXMADM PARM(enable_column dbname nom table nomcolonne '/repertoire/dad/mondad.dad'
'-v' nomdevue '-r' nomdeclé)

-v nomdevue , créé une vue entre la table principale et les tables créés

-r nomdeclé , indique la zone clé (unique) à ajouter dans toutes les tables crées (pour faire la jointure)

4/ Inserez des données par

Insert into sales_tab(invoice_num, sales_person, order)
values('123456', 'Sriram Srinivasan', db2xml.XMLVarcharFromFile('/dxxsamples/xml/getstart.xml'));

le fichier XML inséré doit avoir le même code page (CCSID) que le job (probablement 297, pour nous)

5/ vous pouvez maintenant faire un SELECT sur la vue pour accèder directement aux informations du flux XML

et aussi créer des index sur les tables créés afin d'obtenir de bons temps de réponse

 

6/ Vous pourriez aussi utiliser les fonctions suivantes, pour lire directement le flux XML (même s'il n'a pas été "mappé" dans des fichiers)

extractInteger(), extractSmallint(), extractDOuble(), extractReal(), extractChar(),

extractVarchar(), extractClob(), extractDate(), extractTime(), extractTimestamp(),

toutes ces fonctions existent sous forme de fonction table (UDTF) avec un S en plus, (extractIntegers par exemple) retournant une table de données quand les occurences sont multiples. Elle attendent toutes, un objet XML et un chemin identifiant la donnée dans le flux XML.

 

quelques exemples :

select * from sales_tab where extractChar(order, '/Order/Customer/Email') like '%am.com%'
-- extrait les lignes de SALES_TAB ayant l'élement EMail (chemin /Order/Customer) de la zone XML order contenant am.com
select * from TABLE ( extractvarchars( (select "ORDER" from sales_tab) , '/Order/Part/key') ) as x
-- extrait de order de SALES_TAB les élements key (chemin /Order/Part) puis les affiche
select * from TABLE ( extractvarchars( (select "ORDER" from sales_tab) , '/Order/Part[@color="black "]/key') ) as x
-- extrait de order de SALES_TAB les élements key (chemin /Order/Part) si l'attribut color = "black", puis les affiche

 

Enfin la fonction UPDATE(objetXML, chemin, valeur) met à jour le flux XML et assigne la valeur au chemin indiqué (Path XML)

 

Transposition du flux XML dans une série de tables base de données ou réciproquement..

Vous devez passer par un fichier DAD, déclaré dans XML_USAGE, pour assurer le "mappage" entre la base et le flux XML, de type :

 

1/ SQL Mapping

Contient un SELECT sur les tables base de données, permettant de générer le flux XML (pas le contraire)

 

2/ RDB_node Mapping

Contient un Chemin (Path XML) d'accès aux données dans le flux XML, peut être utilisé pour composer ou décomposer le flux XML

 

Procédures cataloguées associées

dxxGenXML() Génère un document XML et l'insert dans une table, à partir d'un fichier "DAD"
dxxGenXMLCLOB() Retourne un document XML sous forme de CLOB, à partir d'un fichier "DAD"
   
dxxRetrieveXML() Génère un document XML et l'insert dans une table, à partir d'un nom de collection XML
dxxRetrieveXMLCLOB() Retourne un document XML sous forme de CLOB, à partir d'un nom de collection
   
dxxShredXML A partir d'un fichier "DAD", insert dans une collection les données d'un flux XML
dxxInsertXML A partir d'un nom de collection, insert dans une collection les données d'un flux XML

 

 

Copyright © 1995,2007 VOLUBIS