On continue à l'appeler Trinita

Oracle XMLType (relationnel-XML)

Soit les fichiers XML suivants représentant les personnages des films "Trinita" (1967) et "Trinita est de retour" (1968).

1
<?xml version="1.0" encoding="UTF-8"?>
2
<personnes>
3
    <personne>
4
        <nom>Personne</nom>
5
        <prenom>Terence</prenom>
6
    </personne>
7
    <personne>
8
        <nom>Trinita</nom>
9
        <prenom>Terence</prenom>
10
        <age>40</age>
11
    </personne>
12
</personnes>
1
<?xml version="1.0" encoding="UTF-8"?>
2
<personnes>
3
    <personne>
4
        <nom>Fonda</nom>
5
        <prenom>Jack</prenom>
6
        <age>53</age>
7
    </personne>
8
</personnes>

Soit la table suivante en relationnel-XML : film (#nom:varchar(255), annee:number, pers:XMLType).

Question

Créer une table Oracle correspondant en utilisant XMLType.

Solution

1
CREATE TABLE film (
2
nom VARCHAR(255) PRIMARY KEY,
3
age NUMBER,
4
pers XMLTYPE NOT NULL
5
)

Question

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

Solution

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

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.pers.EXTRACT('/personnes/personne/nom').GETSTRINGVAL() AS nom FROM film f;
2
SELECT f.pers.EXTRACT('/personnes/personne[1]/nom').GETSTRINGVAL() AS nom FROM film f;
3
SELECT f.pers.EXTRACT('/personnes/personne[age]/nom').GETSTRINGVAL() AS nom FROM film f;
4
SELECT f.pers.EXTRACT('/personnes/personne[age > 50]/nom').GETSTRINGVAL() AS nom FROM film f;