M1info Bda

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 119

Bases de données avancées

Master 1 Informatique
2021-2022

Jérôme Darmont
https://eric.univ-lyon2.fr/jdarmont/
Actualité du cours

https://eric.univ-lyon2.fr/jdarmont/

https://eric.univ-lyon2.fr/jdarmont/

https://twitter.com/darmont_lyon2 #bda

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 2


Objectifs du cours
SQL : langage de requêtes (bases de données relationnelles)
– Standard
– Optimiseurs de requêtes
– Non procédural
– Données structurées

Programmation nécessaire pour :


Langage
– Tâches complexes
– Interfaces utilisateurs
PL/pgSQL

80 % des données sont peu ou pas structurées


– Description via le langage XML
Langage
XQuery
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 3
Partie 1
PL/pgSQL
Procedural Language/PostgreSQL Structured Query Language

Bases de données avancées 4


Plan

Introduction
Bases du langage
Curseurs
Gestion des erreurs
Déclencheurs
SQL dynamique

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 5


Requêtes SQL dans un programme

SQL encapsulé : Requêtes SQL incorporées dans le code


source (PL/SQL, T-SQL, PL/pgSQL, Pro*C…)
C
U
API : Requêtes SQL via des fonctions du langage (Java R
Persistence API, PHP Data Objects…)
S
Interfaces de niveau appel : intergiciel entre le langage et E
le SGBD (ODBC, JDBC, ADO…)
U
Procédures stockées : Fonctions SQL stockées dans la base R
de données et exécutées par le SGBD (écrites en PL/SQL,
T-SQL, PL/pgSQL)
S
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 6
Choix de PostgreSQL

SGBD relationnel-objet

Licence libre (BSD)

Le plus conforme au standard SQL

Disponible sur de nombreuses plateformes


– Divers UNIX, dont Linux et Mac OS
– Windows
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 7
Historique de PostgreSQL
Michael Stonebraker

1974 : Ingres
(INteractive Graphics REtrieval System)

1985 : Postgres (post-Ingres)

1995 : Postgres95 (fonctionnalités SQL) fr.wikipedia.org

1996 : PostgreSQL (v6)

2021 : v13.3

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 8


Caractéristiques de PostgreSQL

Types structurés (enregistrements, tableaux)


possibles dans les tables (relationnel étendu)

Comportement stable

Langage procédural PL/pgSQL proche du PL/SQL


d’Oracle (permet le SQL dynamique)

Interfaçage possible avec des modules externes


d’autres langages (PERL, Python…)
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 9
Caractéristiques de PL/pgSQL

Utilisation des types de données, opérateurs et


fonctions de SQL

Stockage du code dans la base de données


– Sécurité liée à celle du SGBD et de ses droits d’accès

Exécution au sein du serveur de BD


– Pas d’allers-retours entre client et serveur
⇒ Performance
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 10
Sondage express

A) Jusqu’ici, tout va bien.

B) Je suis déjà perdu.

Répondre sur https://toreply.univ-lille.fr

Question n° 455
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 11
Plan

Introduction
Bases du langage
Curseurs
Gestion des erreurs
Déclencheurs
SQL dynamique

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 12


Structuration en blocs

[DECLARE
-- Déclarations]
BEGIN
-- Instructions PL/pgSQL
[EXCEPTION
-- Gestion des erreurs]
END [ ] : clause optionnelle
(idem dans tout le document)
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 13
Variables et constantes

Déclaration dans la section DECLARE d’un bloc PL/pgSQL

Variables
ex. dateNaissance DATE;
compteur INTEGER := 0; -- Initialisation
compteur2 INTEGER DEFAULT 0; -- Valeur par défaut
id CHAR(5) NOT NULL := ‘AP001’;

Constantes
ex. tauxTVA CONSTANT REAL := 0.2;

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 14


Principaux types de données
Type Description

boolean, bool Booléen (vrai/faux)


smallint, int2 Entier de -32768 à +32767
integer, int, int4 Entier de -2147483648 à +2147483647
bigint, int8 Entier de -9223372036854775808 à +9223372036854775807
real, float4 Réel simple précision (6 décimales)
double precision, float8 Réel double précision (15 décimales)
numeric, numeric(P, S), decimal, decimal (P, S) Nombre jusqu'à 131072 chiffres avant la virgule (P), 16383 après (S)

character[N], char[N] Chaîne de caractères de longueur N fixe


varchar, varchar[N] Chaîne de caractères de longueur variable (maximum N si précisé)

text Texte long de longueur variable (nécessite des opérateurs


spécifiques)

date Date (ex. ‘jj/mm/aaaa’)


time Heure (ex. ‘hh:mm:ss’)
timestamp
Bases de données avancées Date et heure (ex. ‘aaaa-mm-jj
https://eric.univ-lyon2.fr/jdarmont/ hh:mm:ss’) 15
Référencer un type existant

Type d’une autre variable


ex. credit REAL;
debit credit%TYPE;

Type de l’attribut d’une table


ex. numEmp EMP.EMPNO%TYPE; À utiliser
au maximum !
Type des n-uplets d’une table
ex. unEtudiant STUDENT%ROWTYPE;

N-uplet indéfini (enregistrement)


ex. resultat RECORD;
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 16
Types structurés

Tableaux
ex. notes NUMERIC(2, 2)[];
matrice INTEGER[][];

Types composites (enregistrements)


ex. CREATE TYPE tEmploye AS ( -- Définition
num NUMERIC,
nom VARCHAR
); -- à définir hors de PL/pgSQL (commande SQL)

unEmploye tEmploye; -- Instanciation


Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 17
Affectation simple

Variables
ex. n := 0;
n := n + 1;

Tableaux
ex. notes := ARRAY[10.2, 13.3, 15.5, 9.8];
matrice := ARRAY[ ARRAY[4, 2],
ARRAY[1, 9] ];
Enregistrements
ex. unEmploye := (1501, 'DARMONT');

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 18


Lecture de valeurs de la base de données

Variables
ex. SELECT custname INTO nomClient
FROM customer WHERE custnum = 10;
SELECT ename, sal INTO nom, salaire
FROM emp WHERE empno = 5000;

Enregistrements
ex. SELECT empno, ename INTO unEmploye
FROM emp WHERE empno = 1501;
SELECT * INTO resultat
FROM customer WHERE custnum = 20;
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 19
Opérateurs arithmétiques et logiques

Opérateurs arithmétiques + - / * **

Opérateur de concaténation ||

Opérateurs de comparaison = < > <= >= <>


IS NULL LIKE BETWEEN IN

Opérateurs logiques AND OR NOT

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 20


Tests (1/3)

IF-THEN, IF-THEN-ELSE ou IF-THEN-ELSIF

IF condition1 THEN
-- -- Instructions PL/pgSQL
[ELSIF condition2 THEN
-- Instructions PL/pgSQL]
[ELSE
-- Instructions PL/pgSQL]
END IF;

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 21


Tests (2/3)

CASE simple

CASE variable
WHEN val1 THEN -- Instructions PL/pgSQL
WHEN val2, val3 THEN -- Instructions PL/pgSQL
WHEN val4 THEN -- Instructions PL/pgSQL
[ELSE -- Instructions par défaut]
END CASE;

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 22


Tests (3/3)

CASE par intervalles

CASE
WHEN var BETWEEN val1 AND val2 THEN
-- Instructions PL/pgSQL
WHEN var BETWEEN val2 + 1 AND val3 THEN
-- Instructions PL/pgSQL
END CASE;

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 23


Boucles
Pour
FOR iterateur IN [REVERSE] min..max [BY pas] LOOP
-- Instructions PL/pgSQL
END LOOP;

Tant que
WHILE condition LOOP
-- Instructions PL/pgSQL
END LOOP;

Répéter jusqu’à
LOOP
-- Instructions PL/pgSQL
EXIT WHEN condition; -- C’est moche, mais
END LOOP; -- pas le choix...
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 24
Boucles sur tableaux

Tableau
FOREACH note IN ARRAY notes LOOP -- note est un NUMERIC(2, 2)
-- Instructions PL/pgSQL
END LOOP;

Matrice
FOREACH n IN ARRAY matrice LOOP -- n est un INTEGER
-- Instructions PL/pgSQL
END LOOP;
-- Eh oui, pas besoin de boucles imbriquées !

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 25


Quizz
Combien y a-t-il de sections
dans un bloc PL/pgSQL ?
A) 1
B) 2
C) 3
D) 4
E) 5

Répondre sur https://toreply.univ-lille.fr

Question n° 494
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 26
Implémentation d’un bloc

Dans une fonction


ex. CREATE [OR REPLACE] FUNCTION test() RETURNS VOID AS $$
-- bloc PL/pgSQL
$$ LANGUAGE plpgsql;

Exécution de la fonction
ex. SELECT test(); -- La forme du résultat peut différer
SELECT * FROM test(); -- en fonction des clients PostreSQL.

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 27


Exemple de fonction
-- Calcul de prix TTC
CREATE OR REPLACE FUNCTION calculPrixTTC(idProduct NUMERIC) RETURNS REAL AS $$
DECLARE
tauxTVA CONSTANT REAL := 0.2;
prixHT demo_product_info.list_price%TYPE;
BEGIN
-- Lire le prix HT
SELECT list_price INTO prixHT FROM demo_product_info
WHERE product_id = idProduct;
-- Retourner le prix TTC
RETURN prixHT * (1 + tauxTVA) ::REAL;
END
$$ LANGUAGE plpgsql;

-- Exécution
SELECT calculPrixTTC(10);
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 28
Fonction retournant plusieurs valeurs

Paramètres de sortie
CREATE OR REPLACE FUNCTION calculs( n1 INT, n2 INT,
OUT somme INT, OUT produit INT) AS $$
-- Pas de RETURN
BEGIN
somme := n1 + n2;
produit := n1 * n2;
END
$$ LANGUAGE plpgsql;

SELECT calculs(4, 5); -- Sous forme d’enregistrement (valeurs uniquement)


-- ou
SELECT * FROM calculs(4, 5); -- Sous forme de table (avec entêtes somme et produit)

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 29


Fonction retournant plusieurs enregistrements

CREATE OR REPLACE FUNCTION serie(taille INT, pas INT) RETURNS SETOF INT AS $$
DECLARE
i INT;
BEGIN
FOR i IN 1..taille BY pas LOOP
RETURN NEXT i;
END LOOP;
RETURN;
END
$$ LANGUAGE plpgsql;

SELECT serie(10, 2);

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 30


Appel de fonction dans une fonction

CREATE OR REPLACE FUNCTION droleDeDiv(n1 INT, n2 INT) RETURNS REAL AS $$


DECLARE
s INT;
p INT;
BEGIN
SELECT * INTO s, p FROM calculs(n1, n2);
RETURN p / s ::REAL;
END
$$ LANGUAGE plpgsql;

SELECT droleDeDiv(5, 6);

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 31


Récursivité
CREATE OR REPLACE FUNCTION factorielle(n INTEGER) RETURNS INTEGER AS $$
DECLARE
f INTEGER;
BEGIN
IF n = 1 THEN -- Condition d'arrêt
RETURN 1;
ELSE
SELECT * INTO f FROM factorielle(n - 1); -- Appel récursif
RETURN n * f;
END IF;
END
$$ LANGUAGE plpgsql;

SELECT factorielle(10);

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 32


Sondage express

Peut-on écrire un bloc PL/pgSQL


en-dehors d’une fonction?

Répondre sur https://toreply.univ-lille.fr

Question n° 454
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 33
Plan

Introduction
Bases du langage
Curseurs
Gestion des erreurs
Déclencheurs
SQL dynamique

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 34


Contexte d’utilisation des curseurs

Requête qui retourne un seul n-uplet


– SELECT INTO
– Stockage du résultat dans une ou plusieurs variables
ou un enregistrement

Requête qui retourne plusieurs n-uplets


– Nécessité d’un curseur
– Structure de données en mémoire qui stocke le
résultat de la requête (⇔ tableau d’enregistrements)

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 35


Curseur implicite (non lié)
-- Parcours complet du curseur
CREATE OR REPLACE FUNCTION listeEmp() RETURNS SETOF tEmploye AS $$
DECLARE
nuplet emp%ROWTYPE;
e tEmploye;
BEGIN
FOR nuplet IN SELECT * FROM emp LOOP
e.num := nuplet.empno;
e.nom := LOWER(nuplet.ename);
RETURN NEXT e;
END LOOP;
RETURN;
END
$$ LANGUAGE plpgsql;

SELECT listeEmp();
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 36
Curseur explicite (lié)
-- Parcours ad-hoc du curseur (même résultat que listeEmp)
CREATE OR REPLACE FUNCTION listeEmp2() RETURNS SETOF tEmploye AS $$
DECLARE
cursEmp CURSOR FOR SELECT * FROM emp;
nuplet emp%ROWTYPE;
e tEmploye;
BEGIN
OPEN cursEmp;
FETCH cursEmp INTO nuplet; -- Lecture du 1er n-uplet
WHILE FOUND LOOP
e.num := nuplet.empno;
e.nom := LOWER(nuplet.ename);
RETURN NEXT e;
FETCH cursEmp INTO nuplet; -- Lecture du n-uplet suivant
END LOOP;
CLOSE cursEmp;
RETURN;
END
$$ LANGUAGE plpgsql;
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 37
Curseur explicite (lié)
-- Parcours vraiment ad-hoc du curseur (renvoie 1 résultat sur 3)
CREATE OR REPLACE FUNCTION listeEmp3(pas INT) RETURNS SETOF tEmploye AS $$
DECLARE -- Pas de changement
BEGIN
OPEN cursEmp;
FETCH cursEmp INTO nuplet;
WHILE FOUND LOOP
e.num := nuplet.empno;
e.nom := LOWER(nuplet.ename);
RETURN NEXT e;
MOVE FORWARD pas FROM cursEmp; -- MOVE cursEmp; pour un seul décalage
FETCH cursEmp INTO nuplet;
END LOOP;
CLOSE cursEmp;
RETURN;
END
$$ LANGUAGE plpgsql;

SELECT * FROM listeEmp3(2);


Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 38
Curseur paramétré
CREATE OR REPLACE FUNCTION listeEmp4(salPlancher DECIMAL) RETURNS SETOF tEmploye AS $$
DECLARE
cursEmp CURSOR(salMin DECIMAL) FOR SELECT * FROM emp WHERE sal >= salMin;
nuplet emp%ROWTYPE;
e tEmploye;
BEGIN
OPEN cursEmp(salPlancher);
FETCH cursEmp INTO nuplet;
WHILE FOUND LOOP
e.num := nuplet.empno;
e.nom := LOWER(nuplet.ename);
RETURN NEXT e;
FETCH cursEmp INTO nuplet;
END LOOP;
CLOSE cursEmp;
RETURN;
END
$$ LANGUAGE plpgsql;

SELECT listeEmp4(2000); https://eric.univ-lyon2.fr/jdarmont/ 39


Quizz
On veut appliquer un échantillonnage sur
les n-uplets d’une table. Quel type de
curseur doit-on utiliser pour les sélectionner ?

A) Curseur implicite
B) Curseur explicite
C) Curseur paramétré

Répondre sur https://toreply.univ-lille.fr


Question n° 790

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 40


Plan

Introduction
Bases du langage
Curseurs
Gestion des erreurs
Déclencheurs
SQL dynamique

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 41


Signalement d’erreur

RAISE niveauErreur 'message';


Niveau d’erreur Priorité Description

DEBUG 1 Écrit le message dans le log


LOG 2 Écrit le message dans le log
INFO 3 Écrit le message dans le log et l’envoie au client
NOTICE 4 Écrit le message dans le log et l’envoie au client
WARNING 5 Écrit le message dans le log et l’envoie au client
EXCEPTION 6 Interrompt la transaction courante

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 42


Exceptions personnalisées
CREATE OR REPLACE FUNCTION testErreur1(noDept INTEGER) RETURNS REAL AS $$
DECLARE
nbEmp INTEGER;
ref CONSTANT INTEGER := 85;
BEGIN
SELECT COUNT(*) INTO nbEmp FROM emp WHERE deptno = noDept;
IF nbEmp = 0 THEN
RAISE EXCEPTION 'Pas d''employé dans ce département’;
-- RAISE EXCEPTION 'Pas d''employé dans le département %', noDept;
END IF;
RETURN ref / nbEmp ::REAL;
END
$$ LANGUAGE plpgsql;

SELECT testErreur1(99);
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 43
Exploitation des exceptions systèmes
CREATE OR REPLACE FUNCTION testErreur2(noDept INTEGER) RETURNS REAL AS $$
DECLARE
nbEmp INTEGER;
ref CONSTANT INTEGER := 85;
BEGIN
SELECT COUNT(*) INTO nbEmp FROM emp WHERE deptno = noDept;
RETURN ref / nbEmp ::REAL;
EXCEPTION
WHEN division_by_zero THEN
RAISE WARNING 'Pas d''employé dans le département %', noDept;
RETURN NULL;
END
$$ LANGUAGE plpgsql;

SELECT testErreur2(99);
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 44
Traitement par défaut
CREATE OR REPLACE FUNCTION testErreur3(noDept INTEGER) RETURNS REAL AS $$
DECLARE
nbEmp INTEGER;
ref CONSTANT INTEGER := 85;
BEGIN
IF noDept <= 0 THEN
RAISE EXCEPTION 'noDept ne peut pas être négatif';
END IF;
SELECT COUNT(*) INTO nbEmp FROM emp WHERE deptno = noDept;
RETURN ref / nbEmp ::REAL;
EXCEPTION
WHEN division_by_zero THEN
RAISE WARNING 'Personne dans le département %', noDept;
RETURN NULL;
WHEN others THEN -- On peut aussi remplacer others par raise_exception
RETURN -1; -- Code d'erreur
END
$$ LANGUAGE plpgsql;
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 45
Quelques autres exceptions système
Code Nom
22004 null_value_not allowed
22003 numeric_value_out_of_range
22012 division_by_zero
23503 foreign_key_violation
23505 unique_violation
28P01 invalid_password
42501 insufficient_privilege
42883 undefined column
54011 too_many_columns
P0002 no_data_found
P0003 too_many_rows
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 46
Plan

Introduction
Bases du langage
Curseurs
Gestion des erreurs
Déclencheurs
SQL dynamique

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 47


Définition des déclencheurs

Définition : Fonction associée à une table et exécutée


automatiquement lorsque des événements liés à des
actions sur la table surviennent (mises à jour,
principalement).

Complètent les contraintes d’intégrité en permettant de


créer des règles d’intégrité complexes.
– Éléments des bases de données actives.

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 48


Principaux types de déclencheurs

Insert Delete Update

Before 1 2 3

After 4 5 6

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 49


Création/suppression de déclencheur

CREATE TRIGGER nomDeclencheur

BEFORE | AFTER
INSERT | DELETE | UPDATE | [INSERT] [[OR] DELETE] [[OR] UPDATE]

ON nomTable

FOR EACH ROW | FOR EACH STATEMENT | : ou

EXECUTE PROCEDURE nomFonction();

DROP TRIGGER nomDeclencheur

ON nomTable;
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 50
Variables systèmes des déclencheurs

NEW : Enregistrement contenant le n-uplet inséré ou modifié

Ex. INSERT INTO client VALUES (1, 'NouveauClient');

NEW.NumCli prend la valeur 1 dans un déclencheur sur client.


NEW.Nom prend la valeur 'NouveauClient' dans le déclencheur.

OLD : Enregistrement contenant l’ancien n-uplet supprimé ou modifié

Ex. DELETE FROM client WHERE NumCli = 33;

OLD.NumCli prend la valeur 33 dans le déclencheur.

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 51


Exemple de déclencheur (1/2)

-- Emulation de clé primaire sur la table EMP

CREATE OR REPLACE FUNCTION checkEmpPK() RETURNS TRIGGER AS $$


DECLARE
n INTEGER;
BEGIN
-- La clé est-elle vide ?
IF NEW.empno IS NULL THEN
RAISE EXCEPTION 'La clé primaire doit avoir une valeur !’;
END IF;

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 52


Exemple de déclencheur (2/2)
-- La clé existe-t-elle déjà ?
SELECT COUNT(empno) INTO n FROM emp
WHERE empno = NEW.empno;
IF n > 0 THEN
RAISE EXCEPTION 'Clé primaire déjà utilisée !’;
END IF;
RETURN NEW;
END
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigEmpPK


BEFORE INSERT OR UPDATE ON emp
FOR EACH ROW EXECUTE PROCEDURE checkEmpPK();
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 53
Quizz
Deux tables T et T’ ont la même structure.
Chaque ajout de n-uplet dans T doit être
répercuté dans T’.
Quel type de déclencheur faut-il utiliser ?
A) BEFORE INSERT FOR EACH STATEMENT
B) BEFORE INSERT FOR EACH ROW
C) AFTER INSERT FOR EACH STATEMENT
D) AFTER INSERT FOR EACH ROW
Répondre sur https://toreply.univ-lille.fr

Question n° 353
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 54
Plan

Introduction
Bases du langage
Curseurs
Gestion des erreurs
Déclencheurs
SQL dynamique

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 55


SQL statique vs. SQL dynamique

Exemples

– Fonction qui met la table EMP à jour (ex. changement de salaire)


⇒ SQL statique (la requête est connue à la compilation)
– Fonction qui met à jour une table dont le nom est un paramètre
⇒ SQL dynamique (la requête complète n’est pas connue à la
compilation)

Définition du SQL dynamique :


Construction d’une requête SQL à la volée dans un bloc PL/pgSQL

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 56


Requête dynamiques

Exécution : EXECUTE requete [INTO resultat];


– requete est une chaîne de caractères
– resultat est une variable, un ensemble de variables ou un
enregistrement

Note :
– Requêtes paramétrées : valeurs de la base de données.
– Si l’on veut paramétrer des objets (tables, vues, attributs...) :
requête dynamique.

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 57


Exemple de requête dynamique

CREATE OR REPLACE FUNCTION tailleTable(nomTable VARCHAR)


RETURNS INTEGER AS $$
DECLARE
n INTEGER;
BEGIN
EXECUTE 'SELECT COUNT(*) FROM ' || nomTable INTO n;
RETURN n;
END
$$ LANGUAGE plpgsql;

SELECT tailleTable('EMP');

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 58


Curseurs dynamiques (1/2)
-- Exemple 1
CREATE OR REPLACE FUNCTION parcoursTable(nomTable VARCHAR) RETURNS VOID AS $$
DECLARE
dynCurs REFCURSOR;
nuplet RECORD;
BEGIN
OPEN dynCurs FOR EXECUTE 'SELECT * FROM ' || nomTable;
FETCH dynCurs INTO nuplet;
WHILE FOUND LOOP
-- Opérations sur nuplet
FETCH dynCurs INTO nuplet;
END LOOP; Une fonction ne peut pas
CLOSE dynCurs;
retourner un SETOF RECORD.
END
$$ LANGUAGE plpgsql;

SELECT parcoursTable('EMP');

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 59


Curseurs dynamiques (2/2)
-- Exemple 2
CREATE FUNCTION contenuTable(nomTable VARCHAR, nomID VARCHAR)
RETURNS SETOF VARCHAR AS $$
DECLARE
dynCurs REFCURSOR;
id VARCHAR;
BEGIN
OPEN dynCurs FOR EXECUTE 'SELECT ' || nomID || ' FROM ' || nomTable;
FETCH dynCurs INTO id;
WHILE FOUND LOOP
RETURN NEXT id;
FETCH dynCurs INTO id;
END LOOP;
CLOSE dynCurs;
RETURN;
END
$$ LANGUAGE plpgsql;

SELECT contenuTable('EMP', 'EMPNO');


Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 60
Quizz

Lesquelles de ces requêtes


sont dynamiques ?

A) SELECT * FROM emp;


B) SELECT * FROM emp WHERE empno = n;
C) SELECT COUNT(*) FROM nomTable;
D) DROP TABLE emp;

Répondre sur https://toreply.univ-lille.fr/

Question n° 258
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 61
Plan

Introduction
Bases du langage
Curseurs
Gestion des erreurs
Déclencheurs
SQL dynamique

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 62


Partie 2
XML/XQuery

Bases de données avancées 63


Plan

Introduction

Documents XML

Langage XQuery
– XPath
– Requêtes FLWOR
– Requêtes complexes

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 64


Données structurées
Données organisées en entités
Entités similaires : forment des groupes (classes)
Entités du même groupe : même description (attributs)
Pour toutes les entités d’un groupe :
– Chaque attribut a le même type
– Chaque valeur d’attribut a la même taille
– Tous les attributs sont présents
– Les attributs sont toujours dans le même ordre

Données structurés : décrites par un schéma


– Généralement stockées dans des bases de données
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 65
Données non structurées

Données de tous types


Données qui ne suivent aucun schéma ni séquence prédéterminé
Données qui ne suivent aucune règle
Données qui ne sont pas prévisibles

Exemples de données non-structurées :


– Textes
– Images
– Vidéos
– Sons

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 66


Données semi-structurées

Bases de Documents
données
Langages de requête

Années 1990

Moteurs de recherche
Données Données Données
structurées semi-structurées non structurées

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 67


Données semi-structurées
Données organisées en entités sémantiques
Structurées
Entités similaires : groupes
Entités du même groupe : peuvent ne pas avoir les mêmes attributs
Pour toutes les entités d’un groupe :

Non-structurées
– Un même attribut peut avoir des types différents
– Une même valeur d’attribut peut avoir des tailles différentes
– Des attributs peuvent être manquants ou dupliqués
– L’ordre des attributs n’est pas nécessairement important

Données semi-structurées : autodescriptives


– Pages web, documents XML, courriels…

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 68


Exemple de données semi-structurées

Nom Jérôme Darmont


Courriel jerome.darmont@univ-lyon2.fr
jdarmont@eric.univ-lyon2.fr

Courriel sabine.loudcher@univ-lyon2.fr
Nom
– Prénom Loudcher
– Nom de famille Sabine

Nom Julien Velcin


Affiliation Université Lumière Lyon 2

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 69


Modèle de données semi-structuré
Avantages
– Peut représenter des informations issues de sources de données qui ne
peuvent pas êtres contraintes par un schéma
– Format flexible pour l’interopérabilité
– Permet de voir des données structurées comme semi-structurées (Web)
– Schéma facilement évolutif
Inconvénients
– Performance des requêtes sur données à grande échelle
Représentations
– Electronic Data Interchange (EDI) : domaine financier
– Object Exchange Model (OEM) : modèle basé sur les graphes
– SGML, HTML et XML
– JSON, YAML...
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 70
Exemple de graphe OEM

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 71


Gestion de données semi-structurées

Modélisation des données semi-structurées


– Graphes (OEM) – Modèle logique
– XML – Modèle physique

Requêtage des données semi-structurées


– XPath
– XQuery

Stockage des données semi-structurées


– Fichiers plats
– Bases de données relationnelles, relationnelles-objets ou natives XML

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 72


Références

Peter Wood, Birkbeck University of London


Semi-Structured Data
http://www.dcs.bbk.ac.uk/~ptw/

Mike Bergman, Structured Dynamics LLC


Semi-structured Data: Happy 10th Birthday!
http://www.mkbergman.com/153/semi-structured-data-happy-10th-birthday/

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 73


Sondage express

Pensez-vous avoir compris la


Différence entre données structurées,
non structurées et semi-structurées ?

Répondre sur https://toreply.univ-lille.fr/

Question n° 541
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 74
Pourquoi pas JSON, YAML et les BD NoSQL ?

SGBD NoSQL type MongoDB : plus efficaces que


XML/XQuery si besoin de stockage distribué

Pour l'analytics, XQuery est plus puissant


(opérateur // inexistant dans MongoDB)

Les SGBD NoSQL sont étudiés en M2 !

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 75


Plan

Introduction

Documents XML

Langage XQuery
– XPath
– Requêtes FLWOR
– Requêtes complexes

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 76


Le langage XML

XML : Extensible Markup Language


– Format de structuration de données et de documents Internet issu
de SGML
– Définition, gestion, création, transmission et partage de
documents
SG ML
XML est un standard du W3C
– 1996 : Brouillon
– 1997 : XML 1.0
– 2004 : XML 1.1 HTML XML

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 77


Exemple de document XML
<?xml version="1.1" encoding=“utf-8" ?> <!-- Prologue (obligatoire) -->
<annuaire_professeurs> <!-- Élément racine -->
<!– Sous-éléments -->
<professeur>
<nom>Jérôme Darmont</nom>
<courriel>jerome.darmont@univ-lyon2.fr</courriel>
<cours>Bases de données avancées</cours>
<cours>Programmation Web</cours> Ensemble d’éléments imbriqués
</professeur> matérialisés par des balises
<professeur>
<nom>Julien Velcin</nom>
<courriel>julien.velcin@univ-lyon2.fr</courriel>
<cours>Programmation orientée objet</cours>
</professeur>
<!-- Etc. -->
</annuaire_professeurs> <!-- Balise de fin -->
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 78
Règles d’écriture d’un document XML (1/2)

Un document XML a un et un seul élément racine.

Les éléments doivent être correctement emboîtés (les balises


ouvrantes et fermantes ne doivent pas se chevaucher).

Tout élément doit avoir une balise ouvrante et une balise fermante.

Le nom d’un élément doit être identique dans la balise ouvrante et la


balise fermante.

Les noms d’éléments sont sensibles à la casse. Ils doivent


commencer par une lettre ou par _ suivi(e) de lettres, de chiffres,
de . , de – ou de _.
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 79
Règles d’écriture d’un document XML (2/2)

Les noms d’éléments commençant par XML (dans toutes


combinaisons de minuscules et majuscules) sont réservés à des fins
de standardisation.

Un document XML respectant ces règles est dit bien formé.

Un document XML doit être bien formé !

Un document XML peut de plus être valide s’il se conforme à la


structure définie dans une DTD ou un Schéma XML.
Document Type Definition XML Schema

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 80


Schémas XML

DTD XML Schema

Syntaxe spécifique (non XML) Exprimé dans un document XML

Typage faible Typage fort

Modélisation partielle impossible Modélisation partielle possible

Interprétable par un·e Conçu pour des traitements


utilisateur·trice humain·e automatiques

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 81


Éléments XML (1/2)
Caractères non-autorisés : < & ]]>

Eléments emboîtés : profondeur non limitée

– Ex. <annuaire_professeurs>
<professeur>
<nom>
<nom_famille>Zighed</nom_famille>
<prenom>Abdelkader</prenom>
<prenom>Djamel</prenom>
</nom>
</professeur>
</annuaire_professeurs>
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 82
Éléments XML (2/2)

Section CDATA : Bloc de texte libre dans lequel seule la chaîne ]]>
est interdite
– Ex. <nom>
<![CDATA[<Darmont> & <Loudcher>]]>
</nom>

Élément vide : sans contenu


– Ex. <courriel></courriel>
– Formulation équivalente <courriel />

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 83


Attributs d’éléments XML

Attributs : données associées à un élément, complémentaires du


contenu

Définition : couple nom/valeur dans la balise ouvrante de l’élément

– Ex. <bureau campus="PdA" batiment="K">063</bureau>

attribut valeur attribut valeur

Les attributs sont possibles dans les éléments vides.

– Ex. <image source="ma_bobine.png" />

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 84


Contenu d’élément XML vs. attributs (1/2)

Que choisir ?

– <professeur>
<nom>Darmont</nom>
</professeur>

– <professeur nom="Darmont" />

4 principes pour décider


– D’après Uche Ogbuji, Fourthought, Inc.

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 85


Contenu d’élément XML vs. attributs (2/2)
Principe Élément Attribut
Contenu principal Information essentielle Information périphérique
Information structurée Information hiérarchisée Information atomique
Lisibilité Utilisateur.trice humain.e Traitement automatique
Relation élément/attribut Information précisée par une autre

Exemple de relation <stock>


élément/attribut <produit quantité="1500">
<nom>Ordinateur</nom>
</produit>
<produit quantité="500">
<nom>Imprimante</nom>
</produit>
</stock>
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 86
Quizz

Dans un document XML, les données


sont stockées dans :

A) Les éléments

B) Les attributs

Répondre sur https://toreply.univ-lille.fr/

Question n° 252
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 87
Plan

Introduction

Documents XML

Langage XQuery
– XPath
– Requêtes FLWOR
– Requêtes complexes

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 88


Le langage XQuery
Langage de requêtes pour données XML

Similarités avec SQL


Conçu par le W3C

Basé sur des expressions XPath (mêmes modèle de données, fonctions, opérateurs)

Versions
– 2007 : XQuery 1.0 ⊃ XPath 2.0
– 2017 : XQuery 3.1 ⊃ XPath 3.1

Standardisation en cours (standard de fait)


Soutenu par les éditeurs de SGBD (Oracle, Microsoft, IBM…)

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 89


Document XML exemple (1/2)
<?xml version="1.1" encoding="utf-8" ?>

<catalogue>

<dvd zone="1">
<titre>Blade runner</titre>
<realisateur>Ridley Scott</realisateur>
<annee>1982</annee>
<langue>Anglais</langue>
<prix>14.79</prix>
</dvd>

<dvd zone="2">
<titre>La grande vadrouille</titre>
<realisateur>Gérard Oury</realisateur>
<annee>1966</annee>
<duree>122</duree>
<langue>Français</langue>
<prix>19.82</prix>
</dvd> <!-- (…) -->
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 90
Document XML exemple (2/2)
<dvd zone="2">
<titre>Le fabuleux destin d'Amélie Poulain</titre>
<realisateur>Jean-Pierre Jeunet</realisateur>
<annee>2001</annee>
<duree>120</duree>
<langue>Français</langue>
<prix>14.99</prix>
</dvd>

<dvd zone="2">
<titre>The big Lebowski</titre>
<realisateur>Ethan Coen</realisateur>
<realisateur>Joel Coen</realisateur>
<annee>1997</annee>
<duree>112</duree>
<langue>Français</langue>
<langue>Anglais</langue>
<prix>19.82</prix>
</dvd>

Bases de données avancées </catalogue> https://eric.univ-lyon2.fr/jdarmont/ 91


Plan

Introduction

Documents XML

Langage XQuery
– XPath
– Requêtes FLWOR
– Requêtes complexes

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 92


Expressions de chemins (1/3)

Document XML entier


doc("dvd.xml")/catalogue
Résultat Par
Tout le document l’exemple

Un élément donné
doc("dvd.xml")/catalogue/dvd
doc("dvd.xml")/catalogue/dvd/titre
Résultat
<titre>Blade runner</titre>
<titre>La grande vadrouille</titre>
<titre>Le fabuleux destin d'Amélie Poulain</titre>
<titre>The big Lebowski</titre>
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 93
Expressions de chemins (2/3)

Un attribut donné
doc("dvd.xml")/catalogue/dvd/data(@zone)
Résultat
1222

Un élément donné quel que soit son niveau hiérarchique


doc("dvd.xml")/catalogue//titre
//titre
Résultat
<titre>Blade runner</titre>
<titre>La grande vadrouille</titre>
<titre>Le fabuleux destin d'Amélie Poulain</titre>
<titre>The big Lebowski</titre>
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 94
Expressions de chemins (3/3)
Tous les sous-éléments d’un élément
doc("dvd.xml")/catalogue/dvd/*
Résultat
<titre>Blade runner</titre>
<realisateur>Ridley Scott</realisateur>
<annee>1982</annee>
<duree>117</duree>
<langue>English</langue>
<prix>14.79</prix>
<titre>La grande vadrouille</titre>
<realisateur>Gérard Oury</realisateur>
<annee>1966</annee>
<duree>122</duree>
<langue>French</langue>
<prix>19.82</prix> Etc.
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 95
Prédicats XPath (1/2)
ie, dernier, i premiers/derniers éléments
doc("dvd.xml")/catalogue/dvd[1]
doc("dvd.xml")/catalogue/dvd[last()]
doc("dvd.xml")/catalogue/dvd[position() < 3]/titre
Résultat
<titre>Blade runner</titre>
<titre>La grande vadrouille</titre>

Éléments possédant un sous-élément ou attribut donné


doc("dvd.xml")/catalogue/dvd[duree]/titre
Résultat
<titre>La grande vadrouille</titre>
<titre>Le fabuleux destin d'Amélie Poulain</titre>
<titre>The big Lebowski</titre>

doc("dvd.xml")/catalogue/dvd[@zone]
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 96
Prédicats XPath (2/2)

Condition sur un élément ou un attribut


doc("dvd.xml")/catalogue/dvd[prix < 15]
doc("dvd.xml")/catalogue/dvd[@zone = "2" and prix < 15]/titre
Résultat
<titre>Le fabuleux destin d'Amélie Poulain</titre>

Combinaison de chemins
doc("dvd.xml")//titre | doc("dvd.xml")//prix
Résultat
<titre>Blade runner</titre><prix>14.79</prix>
<titre>La grande vadrouille</titre><prix>19.82</prix>
<titre>Le fabuleux destin...</titre><prix>14.99</prix>
<titre>The big Lebowski</titre> <prix>19.82</prix>

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 97


Quizz

Lesquels de ces chemins sont corrects ?

A) /catalogue/dvd/prix
B) doc("dvd.xml")/catalogue/dvd/prix
C) //prix
D) /catalogue//prix

Répondre sur https://toreply.univ-lille.fr/

Question n° 621
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 98
Plan

Introduction

Documents XML

Langage XQuery
Xpath
Requêtes FLWOR
Requêtes complexes

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 99


Requêtes FLWOR

For, Let, Where, Order by, Return

Clause For (1/3) : lie une variable à chaque élément retourné


par une expression (itération)
Exemple
for $x in (1 to 3) <!-- Ceci est un commentaire -->
return <res>{$x}</res>

Résultat
<res>1</res>
<res>2</res>
<res>3</res>

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 100


Clause For (2/3)

Exemple
for $x in (1, 2),
$y in (10, 20) (: Ceci est également un commentaire :)
return <res>x = {$x} et y = {$y}</res>

Résultat
<res>x = 1 et y = 10</res>
<res>x = 1 et y = 20</res>
<res>x = 2 et y = 10</res>
<res>x = 2 et y = 20</res>

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 101


Clause For (3/3)

Exemple
for $x at $i in doc("dvd.xml")/catalogue/dvd/titre
return <dvd id="{$i}">{data($x)}</dvd>

Résultat
<dvd id="1">Blade runner</dvd>
<dvd id="2">La grande vadrouille</dvd>
<dvd id="3">Le fabuleux destin d'Amélie Poulain</dvd>
<dvd id="4">The big Lebowski</dvd>

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 102


Clause Let

Clause Let : Assigner une ou plusieurs valeurs à une


énumération (pas d’itération)

Exemple
let $x := (1 to 5)
return <res>{$x}</res>

Résultat
<res>1 2 3 4 5</res>

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 103


Clause Where

Clause Where : Spécifie une ou plusieurs conditions sur le résultat

Exemple
for $x in doc("dvd.xml")/catalogue/dvd
where $x/prix > 15
return $x/titre

Exemple
for $x in doc("dvd.xml")/catalogue/dvd
where $x/@zone = "2" and $x/prix < 10
return $x/titre

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 104


Clauses Order by et Return (1/2)

Clause Order by : Trie le résultat

Exemple
for $x in doc("dvd.xml")/catalogue/dvd
order by $x/titre
return $x/titre

Exemple
for $x in doc("dvd.xml")/catalogue/dvd
order by $x/@zone, $x/titre descending
return $x/titre

Clause Return : Spécifie le résultat


Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 105
Clause Return (2/2)
Expressions conditionnelles

Exemple
for $x in doc("dvd.xml")/catalogue/dvd
return if ($x/@zone="1")
then <zoneUS>{data($x/titre)}</zoneUS>
else <zoneEU>{data($x/titre)}</zoneEU>
Résultat
<zoneUS>Blade runner</zoneUS>
<zoneEU>La grande vadrouille</zoneEU>
<zoneEU>Le fabuleux destin d’Amélie Poulain</zoneEU>
<zoneEU>The big Lebowski</zoneEU>

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 106


Fonctions XPath/XQuery (1/2)

Fonctions d’accès : data()…

Fonctions numériques : abs(), floor(), ceiling(), round(), number()…


Fonctions de chaînes : string-length(), upper-case(), lower-case(),
normalize-space(), substring(), substring-after(), replace(),
contains()…

Fonctions temporelles : day-from-date(), year-from-date()…

Fonctions de séquences : exists(), distinct-values(), reverse()…

Fonctions contextuelles : last(), position()…


Fonctions booléennes : not()…
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 107
Fonctions XPath/XQuery (2/2)

Exemple d’appel à une fonction


for $x in doc("dvd.xml")/catalog/dvd/titre
let $titreMAJ := upper-case($x)
return <film>{$titreMAJ}</film>

Résultat
<film>BLADE RUNNER</film>
<film>LA GRANDE VADROUILLE</film>
<film>LE FABULEUX DESTIN D'AMÉLIE POULAIN</film>
<film>THE BIG LEBOWSKI</film>

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 108


Plan

Introduction

Documents XML

Langage XQuery
XPath
Requêtes FLWOR
Requêtes complexes

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 109


Clause Group by (XQuery 3)

Regroupement sur un critère


for $d in /catalogue/dvd
group by $z := $d/@zone
return <zone value="{$z}">
<prix_moyen>{avg($d/prix)}</prix_moyen>
</zone>

Regroupement multiple
for $d in /catalogue/dvd
group by $z := $d/@zone, $a := $d/annee
return <groupe zone="{$z}" annee="{$a}">
<prix_moyen>{avg($d/prix)}</prix_moyen>
</groupe>
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 110
Jointures – Documents exemples (1/3)
<?xml version="1.1" encoding="utf-8" ?> <!-- document 1 : clients.xml -->

<clients>

<client id="1">
<nom>Loudcher</nom>
<prenom>Sabine</prenom>
<addresse>Bureau K073</addresse>
</client>

<client id="2">
<nom>Bentayeb</nom>
<prenom>Fadila</prenom>
<addresse>Bureau K061</addresse>
</client>

<client id="3">
<nom>Darmont</nom>
<prenom>Jérôme</prenom>
<addresse>Bureau K063</addresse>
</client>
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 111
</clients>
Jointures – Documents exemples (2/3)
<?xml version="1.1" encoding="utf-8" ?> <!-- document 2 : produits.xml -->

<produits>

<produit id="10">
<nom>Ordinateur</nom>
</produit>

<produit id="20">
<nom>Moniteur</nom>
</produit>

<produit id="30">
<nom>Imprimante</nom>
</produit>

</produits>
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 112
Jointures – Documents exemples (3/3)
<?xml version="1.1" encoding="utf-8" ?> <!-- document 3 : commandes.xml -->
<commandes>
<commande cli-id="1" prod-id="10">
<quantite>3</quantite>
</commande>
<commande cli-id="1" prod-id="20">
<quantite>15</quantite>
</commande>
<commande cli-id="2" prod-id="10">
<quantite>7</quantite>
</commande>
<commande cli-id="2" prod-id="30">
<quantite>10</quantite>
</commande>
<commande cli-id="3" prod-id="30">
<quantite>5</quantite>
</commande>
</commandes>
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 113
Jointures de documents XML (1/3)

Exemple
for $c in doc("clients.xml")//client,
$o in doc("commandes.xml")//commande
where $c/@id = $o/@cli-id
return <res>{data($c/nom)}, {data($c/prenom)}:
{data($o/quantite)}</res>

Résultat
<res>Loudcher, Sabine : 3</res>
<res>Loudcher, Sabine : 15</res>
<res>Bentayeb, Fadila : 7</res>
<res>Bentayeb, Fadila : 10</res>
<res>Darmont, Jérôme : 5</res>

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 114


Jointures de documents XML (2/3)
Exemple
for $c in doc("clients.xml")//client,
$o in doc("commandes.xml")//commande,
$p in doc("produits.xml")//produit
where $c/@id = $o/@cli-id
and $o/@prod-id = $p/@id
return <res>{data($c/nom)}, {data($c/prenom)}:
{data($o/quantite)} x {data($p/nom)}</res>

Résultat
<res>Loudcher, Sabine : 3 x Ordinateur</res>
<res>Loudcher, Sabine : 15 x Moniteur</res>
<res>Bentayeb, Fadila : 7 x Ordinateur</res>
<res>Bentayeb, Fadila : 10 x Imprimante</res>
<res>Darmont, Jérôme : 5 x Imprimante</res>

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 115


Jointures de documents XML (3/3)

Variantes avec les conditions de jointures exprimées


en prédicats de chemins

for $c in doc("clients.xml")//client,
$o in doc("commandes.xml")//commande[@cli-id=$c/@id]
return <res>{data($c/nom)}, {data($c/prenom)}:
{data($o/quantite)}</res>

for $c in //client,
$p in //produit,
$o in //commande[@cli-id=$c/@id and @prod-id=$p/@id]
return <res>{data($c/nom)}, {data($c/prenom)} :
{data($o/quantite)} x {data($p/nom)}</res>

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 116


Quizz

Quelles clauses de requêtes FLWOR sont


également exprimables en XPath ?
A) For
B) Where
C) Order by
D) Group by

Répondre sur https://toreply.univ-lille.fr/

Question n° 695
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 117
Plan

Introduction

Documents XML

Langage XQuery
XPath
Requêtes FLWOR
Requêtes complexes

Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 118


Sondage express

Que pensez-vous de ce cours ?

Répondre sur https://toreply.univ-lille.fr

Question n° 683
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 119

Vous aimerez peut-être aussi