XML et Oracle

La version 9i d'Oracle a introduit un nouveau type de données, à savoir XMLtype ; les données XML peuvent être stockées d'une manière classique au sein des tables ou dans des LOB (et donc être physiquement externalisé du tablespace), voici un aperçu de son utilisation :

Soit une table livre :
create table livre (id_livre number, id_auteur number, titre varchar2(2000), resume XMLTYPE)
XMLTYPE COLUMN "resume" store as clob (tablespace tbslob);



Recherche d'un tuple en fonction d'une valeur dans un champ XML


select * from livre where
resume.extract('//titre/text()').getStringVal() = 'Tuning Oracle';


SELECT titre, extractValue(resume, '//chapitre/numero/text()').getStringVal()
FROM livre
WHERE resume.exists('//chapitre[titre = "Tuning Oracle"]')=1;


Index sur un champ d'une balise XML présent dans une table



create index livre_chap ON livre
(resume.extract('//conclusion/titre/text()'));



Intégrer des données au format XML dans une table Oracle


Considérons le schéma XML d'un élément Voiture ...

<voitures>
<voiture>
<marque>PEUGEOT</marque>
<modele>407</modele>
<nb_places>5</nb_places>
<nb_portes>4</nb_portes>
<couleur>noire</couleur>
</voiture>
<voiture>
<marque>RENAULT</marque>
<modele>Laguna</modele>
<nb_places>5</nb_places>
<nb_portes>5</nb_portes>
<couleur>verte</couleur>
</voiture>
<voitures>


... que l'on désire intégrer dans une table :

create table t_voiture (
marque varchar2(150 char),
modele varchar2(80),
places number,
portes number,
coloris varchar2(80)
);


Voici la requête d'insertion :

insert into t_voiture
select
mon_xml_parse.* from
xmltable('$e/voitures/voiture' passing xmlparse(content '
<voitures><voiture>
<marque>PEUGEOT</marque>
<modele>407</modele>
<nb_places>5</nb_places>
<nb_portes>4</nb_portes>
<couleur>noire</couleur>
</voiture>
<voiture>
<marque>RENAULT</marque>
<modele>Laguna</modele>
<nb_places>5</nb_places>
<nb_portes>5</nb_portes>
<couleur>verte</couleur>
</voiture></voitures>') as "e"
columns marque varchar2(150) path 'marque', modele varchar2(80) path 'modele', places number path 'nb_places', portes number path 'nb_portes', coloris varchar2(80) path 'couleur'
) mon_xml_parse;


Attention, il existe une erreur Oracle dans le cas où la taille d'un noeud (sous-élément à intégrer) dépasse 4000 caractères (corrigé en 11.2) :
ORA-01706: user function result value was too large
Ce problème est référencé dans metalink par la référence 9408883.


Voir aussi :
- Fonction Oracle à partir d'une procédure java
- Les colonnes virtuelles en 11g
- Créer un index de fonction




Vous n'avez pas trouver réponse à votre question ? Préciser votre recherche :

Catégories