TP Génération de XML via SQL

Ce TP peut être réalisé dans les salles TP du Nautibus en démarrant la machine sous Linux Windows, ou sur toute machine personnelle sur laquelle on aura installé un serveur PostgreSQL ainsi qu'un client type pgAdminIII. Le fichier de données à utiliser dans ce cas est tp-xml-sql-2012-data-postgresql.sql

Il peut également être utilisé avec Oracle via le client SQLDeveloper. Connexion aux bases de données pédagogiques Oracle. Dans ce cas il faut charger les données en utilisant tp-xml-sql-2012-data-oracle.sql

Modalités de rendu

Le TP ne sera pas noté

Ce TP est à réaliser seul ou en binôme (trinômes interdits). On téléchargera le fichier de réponses reponses-tp-xml-sql.txt. On complétera le fichier et on le renommera en Groupe_Nom1_Prenom1_Nom2_Prenom2_reponses-tp-xml-sql.txt. Groupe est le numéro groupe de TD de M1, Nom1_Prenom1 est le nom et le prénom du premier membre du binôme, Nom2_Prenom2 est le nom et le prénom du second membre du binôme1). On déposera ce fichier sur Spiral le dimanche 14 octobre 2012 au plus tard.

Le non-respect de ces consignes pourra être sanctionné dans la note de ce TP.

Introduction

L'objectif de ce TP est de pratiquer la création de (fragments de) documents XML directement à partir de données relationnelles en SQL. Le TP consiste dans un premier temps à lire et comprendre le TP “Générer du XML dans Oracle”. Dans un deuxième temps, on créera un ensemble de relation dans une base PostgreSQL (tp-xml-sql-2012-data-postgresql.sql) ou Oracle (tp-xml-sql-2012-data-oracle.sql) et on utilisera les fonctions SQL/XML du dans le TP cité ci-dessus 2) pour générer du XML à partir des données relationnelles.

Mise en place

Bien lire le TP Générer du XML dans Oracle“ afin de comprendre le fonctionnement des fonctions XMLElement, XMLAttributes, XMLForest et XMLAgg.

Utiliser pgAdminIII pour se connecter à la base postgres en utilisant les login/mot de passe etudiant/etudiant.

Exécuter le script tp-xml-sql-2012-data-postgresql.sql/tp-xml-sql-2012-data-oracle.sql afin de créer les tables et d'ajouter des données.

Écrire des requêtes SQL afin de générer du XML en réponse aux requêtes en français ci-dessous. Ce XML se situera toujours dans une colonne vxml dans le résultat de la requête. Il sera toujours conforme à la DTD indiquée dans la question.


Exemple

“Donner le titre de chaque film, un film étant identifié par son id.”
DTD:

<!DOCTYPE titre [
<!ELEMENT titre (#PCDATA)>
]>

Réponse:

SELECT XMLElement(name "titre", titre) AS vxml, id FROM film

Questions

  1. Donner, pour chaque acteur identifié par son id, son nom.
    <!DOCTYPE acteur [
    <!ELEMENT acteur (nom)>
    <!ELEMENT nom (#PCDATA)>
    ]>
  2. Reprendre la question précédente et ajouter un attribut id dans l'élément acteur.
    <!DOCTYPE acteur [
    <!ELEMENT acteur (nom)>
    <!ATTLIST acteur id CDATA #REQUIRED>
    <!ELEMENT nom (#PCDATA)>
    ]>
  3. Pour chaque role (table joue_dans) donner le titre du film et le nom de l'acteur associé, en plus, le cas échéant, du nom du personnage.
    <!DOCTYPE role [
    <!ELEMENT role (acteur,film,personnage?)>
    <!ELEMENT acteur (#PCDATA)>
    <!ELEMENT film (#PCDATA)>
    <!ELEMENT personnage (#PCDATA)>
    ]>
  4. Reprendre la question 2 et ajouter un élément nbRoles dont la valeur est le nombre de roles interprétés par l'acteur en question.
    <!DOCTYPE acteur [
    <!ELEMENT acteur (nom,nbRoles)>
    <!ATTLIST acteur id CDATA #REQUIRED>
    <!ELEMENT nom (#PCDATA)>
    <!ELEMENT nbRoles (#PCDATA)>
    ]>
  5. Pour chaque film, donner son titre, son id comme attribut, son annee et les acteurs (plus précisement leur nom) qui y ont participé.
    <!DOCTYPE film [
    <!ELEMENT film (titre,annee,acteur*)>
    <!ATTLIST film id CDATA #REQUIRED>
    <!ELEMENT titre (#PCDATA)>
    <!ELEMENT annee (#PCDATA)>
    <!ELEMENT acteur (#PCDATA)>
    ]>
  6. Pour les acteurs (nom et id) et les films (titre) dans lesquels ils ont joué, en se limitant aux acteurs ayant joué dans au moins deux films.
    <!DOCTYPE acteur [
    <!ELEMENT acteur (nom,film*)>
    <!ATTLIST acteur id CDATA #REQUIRED>
    <!ELEMENT nom (#PCDATA)>
    <!ELEMENT film (#PCDATA)>
    ]>
  7. Reprendre la question 5 et y ajouter les réalisateurs et les producteurs
    <!DOCTYPE film [
    <!ELEMENT film (titre,annee,acteur*, realisateur*, producteur*)>
    <!ATTLIST film id CDATA #REQUIRED>
    <!ELEMENT titre (#PCDATA)>
    <!ELEMENT annee (#PCDATA)>
    <!ELEMENT acteur (#PCDATA)>
    <!ELEMENT realisateur (#PCDATA)>
    <!ELEMENT producteur (#PCDATA)>
    ]>
1)
le cas échéant
2)
les fonctions de génération SQL d'Oracle du TP sont utilisables également dans PostgreSQL, à l'exception des fonctions pour manipuler XQuery