3. Les tables XML▲
Il est possible de stocker des données au format XML dans une table.
Pour cela, Oracle a créé un nouveau type : XMLType.
Ce type peut être utilisé dans les procédures PL/SQL comme paramètre, variable et valeur retour.
Il contient des méthodes qui permettent de manipuler son contenu.
Des fonctions permettent de créer, extraire et indexer ce type de données.
Les requêtes SQL peuvent être appliquées sur tout ou partie d'un document XML.
Ce type de données peut être stocké sous deux formes :
- Dans une colonne de type LOB
- Dans un objet structuré
Stockage dans une colonne de type LOB
Le document est stocké "tel quel" dans la colonne.
Les performances d'accès par les instructions du DML sont médiocres.
L'accès par les commandes SQL est limité.
Consomme plus d'espace.
Ce type de stockage est conseillé si vous souhaiter simplement stocker le document XML, sans mise à jour particulière.
Stockage dans un objet structuré
Certains caractères non significatifs ne sont pas stockés (saut de ligne, espaces de fin,etc.).
Les performances d'accès par les instructions du DML sont excellentes.
L'accès par les commandes SQL est satisfaisant.
Nécessite moins d'espace de stockage.
Ce type de stockage convient parfaitement à la manipulation de parties du document XML.
Exemple de création d'une table contenant une colonne de type XMLType :
CREATE
TABLE
doc_xml(
identifiant NUMBER
(
5
)
PRIMARY
KEY
,
Nom VARCHAR2
(
64
)
NOY NULL
,
Doc_xml XMLType )
XMLType COLUMN
Doc_xml
STORE AS
CLOB (
TABLESPACE
tbs_lob
STORAGE
(
INITIAL
4096
NEXT
4096
)
CHUNK 4096
NOCACHE NOLOGGING )
;
Exemple de création d'une table de type XMLType (stockage dans une colonne CLOB) :
CREATE
TABLE
doc_xml2 OF
XMLType ;
Exemple de création d'une table de type XMLType (stockage dans un objet relationnel) :
CREATE
TABLE
xwarehouses (
warehouse_id NUMBER
,
warehouse_spec XMLTYPE)
XMLTYPE warehouse_spec STORE AS
OBJECT RELATIONAL
XMLSCHEMA "http://www.oracle.com/xwarehouses.xsd"
ELEMENT "Warehouse"
;
Changer les caractéristiques de stockage d'une colonne XMLType :
ALTER
TABLE
doc_xml
MODIFY
LOB (
Doc_xml.XMLDATA)
(
STORAGE
(
NEXT
16K)
CACHE
)
;
Le schéma XML
Un schéma XML définit une classe de document XML.
Il permet de s'assurer que les données insérées dans les colonnes de type XMLType sont en adéquation avec ce schéma.
Si l'on observe le document XML suivant :
<?xml version="1.0"?>
<purchaseOrder
orderDate
=
"1999-10-20"
>
<shipTo
country
=
"US"
>
<name>
Alice Smith</name>
<street>
123 Maple Street</street>
<city>
Mill Valley</city>
<state>
CA</state>
<zip>
90952</zip>
</shipTo>
<billTo
country
=
"US"
>
<name>
Robert Smith</name>
<street>
8 Oak Avenue</street>
<city>
Old Town</city>
<state>
PA</state>
<zip>
95819</zip>
</billTo>
<comment>
Hurry, my lawn is going wild!</comment>
<items>
<item
partNum
=
"872-AA"
>
<productName>
Lawnmower</productName>
<quantity>
1</quantity>
<USPrice>
148.95</USPrice>
<comment>
Confirm this is electric</comment>
</item>
<item
partNum
=
"926-AA"
>
<productName>
Baby Monitor</productName>
<quantity>
1</quantity>
<USPrice>
39.98</USPrice>
<shipDate>
1999-05-21</shipDate>
</item>
</items>
</purchaseOrder>
Voici ce que doit spécifier le schéma afin que le document XML soit accepté dans la colonne de type XMLType :
<
xsd
:
schema
xmlns
:
xsd
=
"http://www.w3.org/2001/XMLSchema"
>
<
xsd
:
annotation>
<
xsd
:
documentation
xml
:
lang
=
"en"
>
Purchase order schema for Example.com.
Copyright 2000 Example.com. All rights reserved.
</
xsd
:
documentation>
</
xsd
:
annotation>
<
xsd
:
element
name
=
"purchaseOrder"
type
=
"PurchaseOrderType"
/>
<
xsd
:
element
name
=
"comment"
type
=
"xsd:string"
/>
<
xsd
:
complexType
name
=
"PurchaseOrderType"
>
<
xsd
:
sequence>
<
xsd
:
element
name
=
"shipTo"
type
=
"USAddress"
/>
<
xsd
:
element
name
=
"billTo"
type
=
"USAddress"
/>
<
xsd
:
element
ref
=
"comment"
minOccurs
=
"0"
/>
<
xsd
:
element
name
=
"items"
type
=
"Items"
/>
</
xsd
:
sequence>
<
xsd
:
attribute
name
=
"orderDate"
type
=
"xsd:date"
/>
</
xsd
:
complexType>
<
xsd
:
complexType
name
=
"USAddress"
>
<
xsd
:
sequence>
<
xsd
:
element
name
=
"name"
type
=
"xsd:string"
/>
<
xsd
:
element
name
=
"street"
type
=
"xsd:string"
/>
<
xsd
:
element
name
=
"city"
type
=
"xsd:string"
/>
<
xsd
:
element
name
=
"state"
type
=
"xsd:string"
/>
<
xsd
:
element
name
=
"zip"
type
=
"xsd:decimal"
/>
</
xsd
:
sequence>
<
xsd
:
attribute
name
=
"country"
type
=
"xsd:NMTOKEN"
fixed
=
"US"
/>
</
xsd
:
complexType>
<
xsd
:
complexType
name
=
"Items"
>
<
xsd
:
sequence>
<
xsd
:
element
name
=
"item"
minOccurs
=
"0"
maxOccurs
=
"unbounded"
>
<
xsd
:
complexType>
<
xsd
:
sequence>
<
xsd
:
element
name
=
"productName"
type
=
"xsd:string"
/>
<
xsd
:
element
name
=
"quantity"
>
<
xsd
:
simpleType>
<
xsd
:
restriction
base
=
"xsd:positiveInteger"
>
<
xsd
:
maxExclusive
value
=
"100"
/>
</
xsd
:
restriction>
</
xsd
:
simpleType>
</
xsd
:
element>
<
xsd
:
element
name
=
"USPrice"
type
=
"xsd:decimal"
/>
<
xsd
:
element
ref
=
"comment"
minOccurs
=
"0"
/>
<
xsd
:
element
name
=
"shipDate"
type
=
"xsd:date"
minOccurs
=
"0"
/>
</
xsd
:
sequence>
<
xsd
:
attribute
name
=
"partNum"
type
=
"SKU"
use
=
"required"
/>
</
xsd
:
complexType>
</
xsd
:
element>
</
xsd
:
sequence>
</
xsd
:
complexType>
<!-- Stock Keeping Unit, a code for identifying products -->
<
xsd
:
simpleType
name
=
"SKU"
>
<
xsd
:
restriction
base
=
"xsd:string"
>
<
xsd
:
pattern
value
=
"\d{3}-[A-Z]{2}"
/>
</
xsd
:
restriction>
</
xsd
:
simpleType>
</
xsd
:
schema>
La contrainte de schéma se spécifie au moment de la création de la table :
CREATE
TABLE
xwarehouses OF
XMLTYPE
XMLSCHEMA "http://www.w3.org/2001/XMLSchema"
ELEMENT "Warehouse"
;
La documentation Oracle concernant l'utilisation des schémas XML est disponible à l'url suivante :
http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96620/appbsch.htm#621642