T'as le bonjour de Trinita

Oracle XMLType (table XML)

Soit les fichiers XML suivants représentant des films.

1
<film>
2
    <nom>Trinita</nom>
3
    <annee>1967</annee>    
4
    <personnes>
5
        <personne>
6
            <nom>Personne</nom>
7
            <prenom>Terence</prenom>
8
        </personne>
9
        <personne>
10
            <nom>Trinita</nom>
11
            <prenom>Terence</prenom>
12
            <age>40</age>
13
        </personne>
14
    </personnes>
15
</film>
1
<film>
2
    <nom>Trinita est de retour</nom>
3
    <annee>1968</annee>
4
    <personnes>
5
        <personne>
6
            <nom>Fonda</nom>
7
            <prenom>Jack</prenom>
8
            <age>53</age>
9
        </personne>
10
    </personnes>
11
</film>

Question

Créer une table XML sous Oracle pour accueillir ces fichiers XML.

Solution

1
CREATE TABLE film OF XMLTYPE;

Question

Insérer les données de l'exemple dans la table.

Solution

1
INSERT INTO film VALUES (XMLType('
2
<film>
3
    <nom>Trinita</nom>
4
    <annee>1967</annee>    
5
    <personnes>
6
        <personne>
7
            <nom>Personne</nom>
8
            <prenom>Terence</prenom>
9
        </personne>
10
        <personne>
11
            <nom>Trinita</nom>
12
            <prenom>Terence</prenom>
13
            <age>40</age>
14
        </personne>
15
    </personnes>
16
</film>
17
'));
18
INSERT INTO film VALUES (XMLType('
19
<film>
20
    <nom>Trinita est de retour</nom>
21
    <annee>1968</annee>
22
    <personnes>
23
        <personne>
24
            <nom>Fonda</nom>
25
            <prenom>Jack</prenom>
26
            <age>53</age>
27
        </personne>
28
    </personnes>
29
</film>
30
'));
31

Question

Écrivez les requêtes SQL, en utilisant XPath, permettant de sélectionner :

  • tous les noms de tous les personnages

  • le nom du premier personnage de chaque film

  • les noms des personnages dont l'age est renseigné

  • les noms des personnages qui ont plus de 50 ans

Indice

SELECT f.pers.EXTRACT('XPath').GETSTRINGVAL() AS ... FROM film f;

Solution

1
SELECT f.EXTRACT('/film/personnes/personne/nom').GETSTRINGVAL() AS nom FROM film f;
2
SELECT f.EXTRACT('/film/personnes/personne[1]/nom').GETSTRINGVAL() AS nom FROM film f;
3
SELECT f.EXTRACT('/film/personnes/personne[age]/nom').GETSTRINGVAL() AS nom FROM film f;
4
SELECT f.EXTRACT('/film/personnes/personne[age>50]/nom').GETSTRINGVAL() AS nom FROM film f;