Sunteți pe pagina 1din 30

18/09/2018

Actualité du cours

Bases de données avancées


http://eric.univ-lyon2.fr/~jdarmont/?page_id=3142
Master 1 Informatique
2018-2019

Jérôme Darmont http://eric.univ-lyon2.fr/~jdarmont/?feed=rss2


http://eric.univ-lyon2.fr/~jdarmont/

https://twitter.com/darmont_lyon2 #bda

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

Objectifs du cours

SQL : langage de requêtes (bases de données relationnelles) Partie 1


– Standard
– Optimisateurs de requêtes
PL/pgSQL
– Non procédural Procedural Language/PostgreSQL Structured Query Language

Programmation nécessaire pour :


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

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


– Description via le langage XML
XQuery
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 3 Bases de données avancées 4

1
18/09/2018

Plan Requêtes SQL dans un programme

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


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

Choix de PostgreSQL Historique de PostgreSQL


Michael Stonebraker
SGBD relationnel-objet 1974 : Ingres
(INteractive Graphics REtrieval System)
Licence libre (BSD)
1985 : Postgres (post-Ingres)
Le plus conforme au standard SQL
1995 : Postgres95 (fonctionnalités SQL) fr.wikipedia.org
Disponible sur de nombreuses plateformes
– Divers UNIX, dont Linux et Mac OS 1996 : PostgreSQL (v6)
– Windows
2018 : v10.5

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

2
18/09/2018

Caractéristiques de PostgreSQL Caractéristiques de PL/pgSQL

Types structurés (enregistrements, tableaux) Utilisation des types de données, opérateurs et


possibles dans les tables fonctions de SQL
Comportement stable Stockage du code dans la base de données
Langage procédural PL/pgSQL proche du PL/SQL – Sécurité liée à celle du SGBD et de ses droits d’accès
d’Oracle (permet le SQL dynamique) Exécution au sein du serveur de BD
Interfaçage possible avec des modules externes – Pas d’allers-retours entre client et serveur  Performance
d’autres langages (PERL, Python…)

Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 9 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 10

Sondage express Plan

A. Jusqu’ici, tout va bien. Introduction


Bases du langage
B. Je suis déjà perdu. Curseurs
Gestion des erreurs
Répondre sur http://toreply.univ-lille1.fr Déclencheurs
Question n° 835 SQL dynamique

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

3
18/09/2018

Structuration en blocs Variables et constantes

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


-- Déclarations]
Variables
BEGIN ex. dateNaissance DATE;
-- Instructions PL/pgSQL compteur INTEGER := 0; -- Initialisation
compteur2 INTEGER DEFAULT 0; -- Valeur par défaut
[EXCEPTION id CHAR(5) NOT NULL := ‘AP001’;
-- Gestion des erreurs]
Constantes
END ex. tauxTVA CONSTANT REAL := 0.2;

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

Principaux types de données Référencer un type existant


Type Description
boolean, bool Booléen (vrai/faux)
smallint, int2 Entier de -32768 à +32767
Type d’une autre variable
integer, int, int4 Entier de -2147483648 à +2147483647
ex. credit REAL;
debit credit%TYPE;
bigint, int8 Entier de -9223372036854775808 à +9223372036854775807
real, float4 Réel simple précision (6 décimales)
Type de l’attribut d’une table
double precision, float8 Réel double précision (15 décimales)
ex. numEmp EMP.EMPNO%TYPE; À utiliser
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 Type des n-uplets d’une table au maximum !
varchar, varchar[N] Chaîne de caractères de longueur variable (maximum N si précisé) ex. unEtudiant STUDENT%ROWTYPE;
text Texte long de longueur variable (nécessite des opérateurs spécifiques)
date Date (ex. ‘jj/mm/aaaa’) N-uplet indéfini (enregistrement)
time Heure (ex. ‘hh:mm:ss’) ex. resultat RECORD;
timestamp Date et heure (ex. ‘aaaa-mm-jj hh:mm:ss’)
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 15 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 16

4
18/09/2018

Types structurés Affectation simple

Tableaux Variables
ex. notes NUMERIC(2, 2)[]; ex. n := 0;
matrice INTEGER[][]; n := n + 1;

Types composites (enregistrements) Tableaux


ex. notes := ARRAY[10.2, 13.3, 15.5, 9.8];
ex. CREATE TYPE tEmploye AS ( matrice := ARRAY[ ARRAY[4, 2],
num NUMERIC, ARRAY[1, 9] ];
nom VARCHAR Enregistrements
); -- à définir hors de PL/pgSQL ex. unEmploye := (1501, 'DARMONT');
unEmploye tEmploye;
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 17 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 18

Lecture de valeurs de la base de données Opérateurs arithmétiques et logiques

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


ex. SELECT custname INTO nomClient
FROM customer WHERE custnum = 10;
Opérateur de concaténation ||
SELECT ename, sal INTO nom, salaire
FROM emp WHERE empno = 5000;
Opérateurs de comparaison = < > <= >= <>
Enregistrements IS NULL LIKE BETWEEN IN
ex. SELECT empno, ename INTO unEmploye
FROM emp WHERE empno = 1501;
Opérateurs logiques AND OR NOT
SELECT * INTO resultat
FROM customer where custnum = 20;

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

5
18/09/2018

Tests (1/3) Tests (2/3)

IF-THEN, IF-THEN-ELSE ou IF-THEN-ELSIF CASE simple

IF condition1 THEN CASE variable


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

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

Tests (3/3) Boucles


Pour
CASE par intervalles FOR iterateur IN [REVERSE] min..max [BY pas] LOOP
-- Instructions PL/pgSQL
END LOOP;
CASE Tant que
WHEN var BETWEEN val1 AND val2 THEN WHILE condition LOOP
-- Instructions PL/pgSQL -- Instructions PL/pgSQL
END LOOP;
WHEN var BETWEEN val2 + 1 AND val3 THEN
-- Instructions PL/pgSQL Répéter jusqu’à
LOOP
END CASE; -- Instructions PL/pgSQL
EXIT WHEN condition;
END LOOP;
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 23 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 24

6
18/09/2018

Boucles sur tableaux Quizz


Combien y a-t-il de sections
Tableau dans un bloc PL/pgSQL ?
FOREACH note IN ARRAY notes LOOP -- note est un NUMERIC(2, 2) A. 1
-- Instructions PL/pgSQL B. 2
END LOOP;
C. 3
Matrice D. 4
E. 5
FOREACH n IN ARRAY matrice LOOP -- n est un INTEGER
-- Instructions PL/pgSQL Répondre sur http://toreply.univ-lille1.fr
END LOOP;
-- Et oui, pas de boucles imbriquées ! Question n° 472
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 25 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 26

Implémentation d’un bloc Exemple de fonction


-- Calcul de prix TTC
CREATE OR REPLACE FUNCTION calculPrixTTC(idProduct NUMERIC) RETURNS REAL AS $$
Dans une fonction DECLARE
tauxTVA CONSTANT REAL := 0.2;
prixHT demo_product_info.list_price%TYPE;
ex. CREATE [OR REPLACE] FUNCTION test() RETURNS VOID AS $$ BEGIN
-- bloc PL/pgSQL -- Lire le prix HT
$$ LANGUAGE plpgsql; SELECT list_price INTO prixHT FROM demo_product_info;
WHERE product_id = idProduct;
-- Retourner le prix TTC
Exécution de la fonction RETURN prixHT * (1 + tauxTVA) ::REAL;
END
ex. SELECT test(); -- Données brutes $$ LANGUAGE plpgsql;
SELECT * FROM test(); -- Sous forme de table
-- Exécution
SELECT calculPrixTTC(10);
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 27 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 28

7
18/09/2018

Fonction retournant plusieurs valeurs Fonction retournant plusieurs enregistrements

Paramètres de sortie CREATE OR REPLACE FUNCTION serie(taille INT, pas INT) RETURNS SETOF INT AS $$
DECLARE
CREATE OR REPLACE FUNCTION calculs(n1 INT, n2 INT, OUT somme INT, OUT produit INT) AS $$ i INT;
-- Pas de RETURN BEGIN
BEGIN FOR i IN 1..taille BY pas LOOP
somme := n1 + n2;
RETURN NEXT i;
produit := n1 * n2;
END
END LOOP;
$$ LANGUAGE plpgsql; RETURN;
END
SELECT calculs(4, 5); -- Sous forme d’enregistrement (valeurs uniquement) $$ LANGUAGE plpgsql;
-- ou
SELECT * FROM calculs(4, 5); -- Sous forme de table (avec entêtes somme et produit) SELECT serie(10, 2);
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 29 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 30

Appel de fonction dans une fonction Récursivité

CREATE OR REPLACE FUNCTION droleDeDiv(n1 INT, n2 INT) RETURNS REAL AS $$ CREATE OR REPLACE FUNCTION facto(n INTEGER) RETURNS INTEGER AS $$
DECLARE
DECLARE
f INTEGER;
s INT; BEGIN
p INT; IF n = 1 THEN -- Condition d'arrêt
BEGIN RETURN 1;
SELECT * INTO s, p FROM calculs(n1, n2); ELSE
RETURN p / s ::REAL; SELECT * INTO f FROM facto(n - 1); -- Appel récursif
END RETURN n * f;
$$ LANGUAGE plpgsql; END IF;
END
$$ LANGUAGE plpgsql;
SELECT droleDeDiv(5, 6);
SELECT facto(10);
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 31 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 32

8
18/09/2018

Sondage express Plan

Peut-on écrire un bloc PL/pgSQL Introduction


en-dehors d’une fonction? Bases du langage
Curseurs
Gestion des erreurs
Déclencheurs
Répondre sur http://toreply.univ-lille1.fr
SQL dynamique
Question n° 138
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 33 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 34

Contexte d’utilisation des curseurs Curseur implicite (non lié)


-- Parcours complet du curseur
CREATE OR REPLACE FUNCTION listeEmp() RETURNS SETOF tEmploye AS $$
Requête qui retourne un seul n-uplet DECLARE
– SELECT INTO nuplet emp%ROWTYPE;
e tEmploye;
– Stockage du résultat dans une ou plusieurs variables ou un BEGIN
enregistrement FOR nuplet IN SELECT * FROM emp LOOP
e.num := nuplet.empno;
e.nom := LOWER(nuplet.ename);
Requête qui retourne plusieurs n-uplets RETURN NEXT e;
END LOOP;
– Nécessité d’un curseur RETURN;
END
– Structure de données en mémoire qui stocke le résultat de la
$$ LANGUAGE plpgsql;
requête (≈ tableau d’enregistrements)
SELECT * FROM listeEmp();
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 35 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 36

9
18/09/2018

Curseur explicite (lié) Curseur explicite (lié)


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

Curseur paramétré Quizz


CREATE OR REPLACE FUNCTION listeEmp4(salPlancher DECIMAL) RETURNS SETOF tEmploye AS $$
DECLARE On veut appliquer un échantillonnage sur les
cursEmp CURSOR(salMin DECIMAL) FOR SELECT * FROM emp WHERE sal >= salMin;
nuplet emp%ROWTYPE; n-uplets d’une table. Quel type de curseur
e tEmploye;
BEGIN
doit-on utiliser pour les sélectionner ?
OPEN cursEmp(salPlancher);
FETCH cursEmp INTO nuplet;
WHILE FOUND LOOP
A. Curseur implicite
e.num := nuplet.empno; B. Curseur explicite
e.nom := LOWER(nuplet.ename);
RETURN NEXT e; C. Curseur paramétré
FETCH cursEmp INTO nuplet;
END LOOP;
CLOSE cursEmp;
RETURN;
Répondre sur http://toreply.univ-lille1.fr
END
$$ LANGUAGE plpgsql; Question n° 507
SELECT * FROM listeEmp4(2000);
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 39 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 40

10
18/09/2018

Plan Signalement d’erreur

Introduction RAISE niveauErreur 'message';


Bases du langage
Niveau d’erreur Priorité Description
Curseurs DEBUG 1 Écrit le message dans le log
LOG 2 Écrit le message dans le log
Gestion des erreurs
INFO 3 Écrit le message dans le log et l’envoie au client
Déclencheurs 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
SQL dynamique
EXCEPTION 6 Interrompt la transaction courante

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

Exceptions personnalisées Exploitation des exceptions systèmes


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

SELECT * FROM testErreur1(99); SELECT * FROM testErreur2(99);


Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 43 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 44

11
18/09/2018

Traitement par défaut Quelques autres exceptions système


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

Plan Définition des déclencheurs

Introduction
Bases du langage Définition : Fonction associée à une table et exécutée
automatiquement lorsque des événements liés à des actions sur la
Curseurs table surviennent (mises à jour, principalement).

Gestion des erreurs


Complètent les contraintes d’intégrité en permettant de créer des
Déclencheurs règles d’intégrité complexes.
– Éléments des bases de données actives.
SQL dynamique

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

12
18/09/2018

Principaux types de déclencheurs Création/suppression de déclencheur

CREATE TRIGGER nomDeclencheur


Insert Delete Update BEFORE | AFTER
INSERT | DELETE | UPDATE | [INSERT] [[OR] DELETE] [[OR] UPDATE]
ON nomTable
Before 1 2 3 FOR EACH ROW | FOR EACH STATEMENT
EXECUTE PROCEDURE nomFonction();

DROP TRIGGER nomDeclencheur


After 4 5 6
ON nomTable;

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

Variables systèmes des déclencheurs Exemple de déclencheur (1/2)

NEW : Enregistrement contenant le n-uplet inséré ou modifié -- Emulation de clé primaire sur la table EMP

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


CREATE OR REPLACE FUNCTION checkEmpPK() RETURNS TRIGGER AS $$
NEW.NumCli prend la valeur 1 dans le déclencheur. DECLARE
NEW.Nom prend la valeur 'NouveauClient' dans le déclencheur. n INTEGER;
BEGIN
-- La clé est-elle vide ?
OLD : Enregistrement contenant l’ancien n-uplet supprimé ou modifié IF NEW.empno IS NULL THEN
RAISE EXCEPTION 'La clé primaire doit avoir une valeur !’;
Ex. DELETE FROM client WHERE NumCli = 33; END IF;
OLD.NumCli prend la valeur 33 dans le déclencheur.

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

13
18/09/2018

Exemple de déclencheur (2/2) Quizz


-- La clé existe-t-elle déjà ? Deux tables T et T’ ont la même structure.
SELECT COUNT(empno) INTO n FROM emp
WHERE empno = NEW.empno; Chaque ajout de n-uplet dans T doit être
IF n > 0 THEN répercuté dans T’.
RAISE EXCEPTION 'Clé primaire déjà utilisée !’; Quel type de déclencheur faut-il utiliser ?
END IF;
RETURN NEW; A. BEFORE INSERT FOR EACH STATEMENT
END B. BEFORE INSERT FOR EACH ROW
$$ LANGUAGE plpgsql;
C. AFTER INSERT FOR EACH STATEMENT
D. AFTER INSERT FOR EACH ROW
CREATE TRIGGER trigEmpPK
BEFORE INSERT OR UPDATE ON emp Répondre sur http://toreply.univ-lille1.fr
FOR EACH ROW EXECUTE PROCEDURE checkEmpPK();
Question n° 723
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 53 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 54

Plan SQL statique vs. SQL dynamique

Introduction
Exemples
Bases du langage – Fonction qui met la table EMP à jour
 SQL statique (la requête est connue à la compilation)
Curseurs
– Fonction qui met à jour une table dont le nom est un paramètre
Gestion des erreurs  SQL dynamique (la requête complète n’est pas connue à la compilation)

Déclencheurs Définition du SQL dynamique :


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

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

14
18/09/2018

Requête dynamiques Exemple de requête dynamique

Exécution : EXECUTE requete [INTO resultat];


– requete est une chaîne de caractères CREATE OR REPLACE FUNCTION tailleTable(nomTable VARCHAR) RETURNS INTEGER AS $$
DECLARE
– resultat est une variable, un ensemble de variables ou un enregistrement
n INTEGER;
BEGIN
Notes EXECUTE 'SELECT COUNT(*) FROM ' || nomTable INTO n;
RETURN n;
– Requêtes paramétrées : valeurs de la base de données. Si l’on veut END
paramétrer des objets (tables, vues...), requête dynamique. $$ LANGUAGE plpgsql;
– Requêtes qui modifient la structure de la base de données (CREATE, DROP,
SELECT tailleTable('EMP');
ALTER…), même statiques : doivent être exécutées en mode dynamique.

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

Curseurs dynamiques (1/2) Curseurs dynamiques (2/2)


-- Exemple 1 -- Exemple 2
CREATE OR REPLACE FUNCTION parcoursTable(nomTable VARCHAR) RETURNS VOID AS $$ CREATE FUNCTION contenuTable(nomTable VARCHAR, nomID VARCHAR) RETURNS SETOF VARCHAR AS $$
DECLARE DECLARE
dynCurs REFCURSOR; dynCurs REFCURSOR;
nuplet RECORD; id VARCHAR;
BEGIN BEGIN
OPEN dynCurs FOR EXECUTE 'SELECT * FROM ' || nomTable; OPEN dynCurs FOR EXECUTE 'SELECT ' || nomID || ' FROM ' || nomTable;
FETCH dynCurs INTO nuplet; FETCH dynCurs INTO id;
WHILE FOUND LOOP WHILE FOUND LOOP
-- Opérations sur nuplet RETURN NEXT id;
FETCH dynCurs INTO nuplet; FETCH dynCurs INTO id;
END LOOP; Une fonction ne peut pas END LOOP;
CLOSE dynCurs;
CLOSE dynCurs; retourner un SETOF RECORD.
END RETURN;
$$ LANGUAGE plpgsql; END
$$ LANGUAGE plpgsql;
SELECT parcoursTable('EMP');
SELECT contenuTable('EMP', 'EMPNO');
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 59 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 60

15
18/09/2018

Quizz Plan

Lesquelles de ces requêtes sont dynamiques ?


Introduction
A. SELECT * FROM emp; Bases du langage
B. SELECT * FROM emp WHERE empno = n;
C. SELECT COUNT(*) FROM nom_table; Curseurs
D. DROP TABLE emp; Gestion des erreurs
Déclencheurs
Répondre sur http://toreply.univ-lille1.fr

Question n° 106
SQL dynamique

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

Plan

Partie 2 Introduction
XML/XQuery
Documents XML

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

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

16
18/09/2018

Données structurées Données non structurées


Données organisées en entités
Données de tous types
Entités similaires : forment des groupes (classes)
Données qui ne suivent aucun schéma ni séquence prédéterminé
Entités du même groupe : même description (attributs)
Données qui ne suivent aucune règle
Pour toutes les entités d’un groupe :
Données qui ne sont pas prévisibles
– Chaque attribut a le même type
– Chaque valeur d’attribut a la même taille
– Tous les attributs sont présents
Exemples de données non-structurées :
– Les attributs sont toujours dans le même ordre – Textes
– Images
Données structurés : décrites par un schéma – Vidéos
– Généralement stockées dans des bases de données – Sons
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 65 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 66

Données semi-structurées Données semi-structurées

Bases de Documents Données organisées en entités sémantiques


Structurées
donné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
Années 1990 – Un même attribut peut avoir des types différents
Moteurs de recherche
Langages de requête

– Une même valeur d’attribut peut avoir des tailles différentes


– Des attributs peuvent être manquants ou dupliqués
Données Données Données – L’ordre des attributs n’est pas nécessairement important
structurées semi-structurées non structurées
Données semi-structurées : autodescriptives
– Pages web, documents XML, courriels…
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 67 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 68

17
18/09/2018

Exemple de données semi-structurées Modèle de données semi-structuré


Avantages
Nom Jérôme Darmont
– Peut représenter des informations issues de sources de données qui ne
Courriel jerome.darmont@univ-lyon2.fr peuvent pas êtres contraintes par un schéma
jdarmont@eric.univ-lyon2.fr – Format flexible pour l’interopérabilité
– Permet de voir des données structurées comme semi-structurées (Web)
Courriel sabine.loudcher@univ-lyon2.fr
– Schéma facilement évolutif
Nom
Inconvénients
– Prénom Loudcher
– Performance des requêtes sur données à grande échelle
– Nom de famille Sabine
Représentations standards
Nom Julien Velcin – Electronic Data Interchange (EDI) : domaine financier
Affiliation Université Lumière Lyon 2 – Object Exchange Model (OEM) : modèle basé sur les graphes
– SGML, HTML et XML
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 69 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 70

Exemple de graphe OEM 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 http://eric.univ-lyon2.fr/~jdarmont/ 71 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 72

18
18/09/2018

Références Sondage express

Peter Wood, Birkbeck University of London Pensez-vous avoir compris la


Semi-Structured Data
http://www.dcs.bbk.ac.uk/~ptw/
Différence entre données structurées,
non structurées et semi-structurées ?
Mike Bergman, Structured Dynamics LLC
Semi-structured Data: Happy 10th Birthday!
http://www.mkbergman.com/153/semi-structured-data-happy-10th- Répondre sur http://toreply.univ-lille1.fr
birthday/
Question n° 460

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

Pourquoi pas JSON, YAML et les BD NoSQL ? Plan

SGBD NoSQL type MongoDB : plus efficaces que Introduction


XML/XQuery si besoin de stockage distribué Documents XML
Pour l'analytics, Xquery est plus puissant Langage XQuery
(opérateur // inexistant dans MongoDB) – XPath
– Requêtes FLWOR
Les SGBD NoSQL sont étudiés en M2 ! – Requêtes complexes

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

19
18/09/2018

Le langage XML Exemple de document XML


<?xml version="1.1" encoding=“utf-8" ?> <!-- Prologue (obligatoire) -->
<annuaire_professeurs> <!-- Élément racine -->
<!– Sous-éléments -->
XML : Extensible Markup Language
<professeur>
– Format de structuration de données et de documents Internet issu de SGML <nom>Jérôme Darmont</nom>
– Définition, gestion, création, transmission et partage de documents <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
XML est un standard du W3C </professeur> matérialisés par des balises
– 1996 : Brouillon SGML <professeur>
– 1997 : XML 1.0 <nom>Julien Velcin</nom>
– 2004 : XML 1.1 <courriel>julien.velcin@univ-lyon2.fr</courriel>
<cours>Programmation orientée objet</cours>
HTML XML </professeur>
<!-- Etc. -->
</annuaire_professeurs> <!-- Balise de fin -->
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 77 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 78

Règles d’écriture d’un document XML (1/2) Règles d’écriture d’un document XML (2/2)

Un document XML a un et un seul élément racine. Les noms d’éléments commençant par XML (dans toutes combinaisons
de minuscules et majuscules) sont réservés à des fins de
Les éléments doivent être correctement emboîtés (les balises ouvrantes standardisation.
et fermantes ne doivent pas se chevaucher).
Tout élément doit avoir une balise ouvrante et une balise fermante. Un document XML respectant ces règles est dit bien formé.
Le nom d’un élément doit être identique dans la balise ouvrante et la Un document XML doit être bien formé !
balise fermante.
Un document XML peut de plus être valide s’il se conforme à la
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 _. structure définie dans une DTD ou un Schéma XML.
Document Type Definition XML Schema

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

20
18/09/2018

Schémas XML Éléments XML (1/2)

Caractères non-autorisés : < & ]]>


DTD XML Schema
Eléments emboîtés : profondeur non limitée
Syntaxe spécifique (non XML) Exprimé dans un document XML – Ex. <annuaire_professeurs>
<professeur>
Typage faible Typage fort <nom>
<nom_famille>Zighed</nom_famille>
<prenom>Abdelkader</prenom>
Modélisation partielle impossible Modélisation partielle possible <prenom>Djamel</prenom>
</nom>
Interprétable par un·e utilisateur·trice Conçu pour des traitements </professeur>
humain·e automatiques </annuaire_professeurs>
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 81 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 82

Éléments XML (2/2) Attributs d’éléments XML

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


Section CDATA : Bloc de texte libre dans lequel seule la chaîne ]]> est
interdite Définition : couple nom/valeur dans la balise ouvrante de l’élément
– Ex. <nom> – Ex. <bureau campus="PdA" batiment="K">063</bureau>
<![CDATA[<Darmont> & <Loudcher>]]>
</nom>
attribut valeur attribut valeur

Élément vide : sans contenu


Les attributs sont possibles dans les éléments vides.
– Ex. <courriel></courriel>
– Ex. <image source="ma_bobine.png" />
– Formulation équivalente <courriel />

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

21
18/09/2018

Contenu d’élément XML vs. attributs (1/2) Contenu d’élément XML vs. attributs (2/2)
Principe Élément Attribut
Que choisir ? Contenu principal Information essentielle Information périphérique
– <professeur> Information structurée Information hiérarchisée Information atomique
<nom>Darmont</nom> Lisibilité Utilisateur.trice humain.e Traitement automatique
</professeur>
Relation élément/attribut Information précisée par une autre
– <professeur nom="Darmont" />
Exemple de relation <stock>
élément/attribut <produit quantité="1500">
<nom>Ordinateur</nom>
4 principes pour décider </produit>
– Uche Ogbuji, Fourthought, Inc. <produit quantité="500">
<nom>Imprimante</nom>
– Source : http://www.ibm.com/developerworks/xml/library/x-eleatt/ </produit>
</stock>
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 85 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 86

Quizz Plan

Dans un document XML, les données Introduction


sont stockées dans :
Documents XML
A. Les éléments
Langage XQuery
B. Les attributs – XPath
– Requêtes FLWOR
Répondre sur http://toreply.univ-lille1.fr – Requêtes complexes

Question n° 141
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 87 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 88

22
18/09/2018

Le langage XQuery Document XML exemple (1/2)


Langage de requêtes pour données XML <?xml version="1.1" encoding="utf-8" ?>
<catalogue>
Similarités avec SQL <dvd zone="1">
<titre>Blade runner</titre>
Conçu par le W3C <realisateur>Ridley Scott</realisateur>
<annee>1982</annee>
<langue>Anglais</langue>
Basé sur des expressions XPath (mêmes modèle de données, fonctions, opérateurs) <prix>14.79</prix>
</dvd>
Versions <dvd zone="2">
– 2007 : XQuery 1.0 ⊇ XPath 2.0 <titre>La grande vadrouille</titre>
<realisateur>Gérard Oury</realisateur>
– 2017 : XQuery 3.1 ⊇ XPath 3.1
<annee>1966</annee>
<duree>122</duree>
Standardisation en cours <langue>Français</langue>
<prix>19.82</prix>
Soutenu par les éditeurs de SGBD (Oracle, Microsoft, IBM…) </dvd> <!-- (…) -->
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 89 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 90

Document XML exemple (2/2) Plan


<dvd zone="2">
<titre>Le fabuleux destin d'Amélie Poulain</titre>
<realisateur>Jean-Pierre Jeunet</realisateur>
<annee>2001</annee>
Introduction
<duree>120</duree>
<langue>Français</langue>
<prix>14.99</prix> Documents XML
</dvd>
<dvd zone="2">
<titre>The big Lebowski</titre>
Langage XQuery
<realisateur>Ethan Coen</realisateur> – XPath
<realisateur>Joel Coen</realisateur>
<annee>1997</annee> – Requêtes FLWOR
<duree>112</duree>
<langue>Français</langue> – Requêtes complexes
<langue>Anglais</langue>
<prix>19.82</prix>
</dvd>
Bases de données avancées
</catalogue> http://eric.univ-lyon2.fr/~jdarmont/ 91 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 92

23
18/09/2018

Expressions de chemins (1/3) Expressions de chemins (2/3)

Document XML entier Un attribut donné


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

Un élément donné Un élément donné quel que soit son niveau hiérarchique
doc("dvd.xml")/catalogue/dvd doc("dvd.xml")/catalogue//titre
doc("dvd.xml")/catalogue/dvd/titre //titre
Résultat Résultat
<titre>Blade runner</titre> <titre>Blade runner</titre>
<titre>La grande vadrouille</titre> <titre>La grande vadrouille</titre>
<titre>Le fabuleux destin d'Amélie Poulain</titre> <titre>Le fabuleux destin d'Amélie Poulain</titre>
<titre>The big Lebowski</titre> <titre>The big Lebowski</titre>
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 93 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 94

Expressions de chemins (3/3) Prédicats XPath (1/2)


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

24
18/09/2018

Prédicats XPath (2/2) Quizz

Condition sur un élément ou un attribut Lesquels de ces chemins sont-ils corrects ?


doc("dvd.xml")/catalogue/dvd[prix < 15]
doc("dvd.xml")/catalogue/dvd[@zone = "2" and prix < 15]/titre
Résultat A. /catalogue/dvd/prix
<titre>Le fabuleux destin d'Amélie Poulain</titre> B. doc("dvd.xml")/catalogue/dvd/prix
Combinaison de chemins
C. //prix
doc("dvd.xml")//titre | doc("dvd.xml")//prix D. /catalogue//prix
Résultat
<titre>Blade runner</titre><prix>14.79</prix>
<titre>La grande vadrouille</titre><prix>19.82</prix> Répondre sur http://toreply.univ-lille1.fr
<titre>Le fabuleux destin d'Amélie Poulain</titre><prix>14.99</prix>
<titre>The big Lebowski</titre> <prix>19.82</prix> Question n° 709

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

Plan Requêtes FLWOR

Introduction For, Let, Where, Order by, Return

Documents XML Clause For (1/3) : lie une variable à chaque élément retourné par
une expression (itération)
Langage XQuery Exemple
XPath for $x in (1 to 3) <!-- Ceci est un commentaire -->
return <res>{$x}</res>
– Requêtes FLWOR
– Requêtes complexes Résultat
<res>1</res>
<res>2</res>
<res>3</res>
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 99 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 100

25
18/09/2018

Clause For (2/3) Clause For (3/3)

Exemple Exemple
for $x in (1, 2), for $x at $i in doc("dvd.xml")/catalogue/dvd/titre
$y in (10, 20) (: Ceci est également un commentaire :) return <dvd id="{$i}">{data($x)}</dvd>
return <res>x = {$x} et y = {$y}</res>

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

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

Clause Let Clause Where

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


Clause Let : Assigner une ou plusieurs valeurs à une variable
(pas d’itération) Exemple
for $x in doc("dvd.xml")/catalogue/dvd
Exemple where $x/prix > 15
let $x := (1 to 5) return $x/titre
return <res>{$x}</res>
Exemple
Résultat for $x in doc("dvd.xml")/catalogue/dvd
<res>1 2 3 4 5</res> where $x/@zone = "2" and $x/prix < 10
return $x/titre
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 103 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 104

26
18/09/2018

Clauses Order by et Return (1/2) Clause Return (2/2)

Clause Order by : Trie le résultat Expressions conditionnelles

Exemple Exemple
for $x in doc("dvd.xml")/catalogue/dvd for $x in doc("dvd.xml")/catalogue/dvd
order by $x/titre return if ($x/@zone="1")
return $x/titre then <zoneUS>{data($x/titre)}</zoneUS>
else <zoneEU>{data($x/titre)}</zoneEU>
Exemple
for $x in doc("dvd.xml")/catalogue/dvd Résultat
order by $x/@zone, $x/titre descending
<zoneUS>Blade runner</zoneUS>
return $x/titre
<zoneEU>La grande vadrouille</zoneEU>
<zoneEU>Le fabuleux destin d'Amélie Poulain</zoneEU>
Clause Return : Spécifie le résultat <zoneEU>The big Lebowski</zoneEU>
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 105 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 106

Fonctions XPath/XQuery (1/2) Fonctions XPath/XQuery (2/2)

Fonctions d’accès : data()…


Exemple d’appel à une fonction
Fonctions numériques : abs(), floor(), ceiling(), round(), number()… for $x in doc("dvd.xml")/catalog/dvd/titre
Fonctions de chaînes : string-length(), upper-case(), lower-case(), let $titreMAJ := upper-case($x)
return <film>{$titreMAJ}</film>
normalize-space(), substring(), substring-after(), replace(), contains()…
Fonctions temporelles : day-from-date(), year-from-date()… Résultat
Fonctions de séquences : exists(), distinct-values(), reverse()… <film>BLADE RUNNER</film>
<film>LA GRANDE VADROUILLE</film>
Fonctions contextuelles : last(), position()… <film>LE FABULEUX DESTIN D'AMÉLIE POULAIN</film>
Fonctions booléennes : not()… <film>THE BIG LEBOWSKI</film>

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

27
18/09/2018

Plan Clause Group by (XQuery 3)

Regroupement sur un critère


Introduction for $d in /catalogue/dvd
group by $z := $d/@zone
Documents XML return <zone value="{$z}">
<prix_moyen>{avg($d/prix)}</prix_moyen>
</zone>
Langage XQuery
XPath Regroupement multiple
for $d in /catalogue/dvd
Requêtes FLWOR
group by $z := $d/@zone, $a := $d/annee
– Requêtes complexes return <groupe zone="{$z}" annee="{$a}">
<prix_moyen>{avg($d/prix)}</prix_moyen>
</groupe>
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 109 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 110

Jointures – Documents exemples (1/3) Jointures – Documents exemples (2/3)


<?xml version="1.1" encoding="utf-8" ?> <!-- document 1 : clients.xml -->
<clients>
<client id="1"> <?xml version="1.1" encoding="utf-8" ?> <!-- document 2 : produits.xml -->
<nom>Loudcher</nom>
<produits>
<prenom>Sabine</prenom>
<addresse>Bureau K073</addresse> <produit id="10">
</client> <nom>Ordinateur</nom>
</produit>
<client id="2">
<nom>Bentayeb</nom> <produit id="20">
<prenom>Fadila</prenom> <nom>Moniteur</nom>
<addresse>Bureau K061</addresse> </produit>
</client> <produit id="30">
<client id="3"> <nom>Imprimante</nom>
<nom>Darmont</nom> </produit>
<prenom>Jérôme</prenom> </produits>
<addresse>Bureau K063</addresse>
</client>
</clients>
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 111 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 112

28
18/09/2018

Jointures – Documents exemples (3/3) Jointures de documents XML (1/3)


<?xml version="1.1" encoding="utf-8" ?> <!-- document 3 : commandes.xml -->
<commandes>
<commande cli-id="1" prod-id="10">
Exemple
<quantite>3</quantite> for $c in doc("clients.xml")//client,
</commande> $o in doc("commandes.xml")//commande
<commande cli-id="1" prod-id="20">
<quantite>15</quantite>
where $c/@id = $o/@cli-id
</commande> return <res>{data($c/nom)}, {data($c/prenom)}:
<commande cli-id="2" prod-id="10"> {data($o/quantite)}</res>
<quantite>7</quantite>
</commande> Résultat
<commande cli-id="2" prod-id="30"> <res>Loudcher, Sabine : 3</res>
<quantite>10</quantite>
</commande> <res>Loudcher, Sabine : 15</res>
<commande cli-id="3" prod-id="30"> <res>Bentayeb, Fadila : 7</res>
<quantite>5</quantite> <res>Bentayeb, Fadila : 10</res>
</commande>
</commandes>
<res>Darmont, Jérôme : 5</res>
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 113 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 114

Jointures de documents XML (2/3) Jointures de documents XML (3/3)


Exemple
for $c in doc("clients.xml")//client, Variantes avec les conditions de jointures exprimées
$o in doc("commandes.xml")//commande, en prédicats de chemins
$p in doc("produits.xml")//produit
for $c in doc("clients.xml")//client,
where $c/@id = $o/@cli-id
$o in doc("commandes.xml")//commande[@cli-id=$c/@id]
and $o/@prod-id = $p/@id
return <res>{data($c/nom)}, {data($c/prenom)}:
return <res>{data($c/nom)}, {data($c/prenom)}:
{data($o/quantite)}</res>
{data($o/quantite)} x {data($p/nom)}</res>
for $c in //client,
Résultat $p in //produit,
<res>Loudcher, Sabine : 3 x Ordinateur</res>
<res>Loudcher, Sabine : 15 x Moniteur</res>
$o in //commande[@cli-id=$c/@id and @prod-id=$p/@id]
<res>Bentayeb, Fadila : 7 x Ordinateur</res> return <res>{data($c/nom)}, {data($c/prenom)} :
<res>Bentayeb, Fadila : 10 x Imprimante</res> {data($o/quantite)} x {data($p/nom)}</res>
<res>Darmont, Jérôme : 5 x Imprimante</res>
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 115 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 116

29
18/09/2018

Quizz Plan

Quelles clauses de requêtes FLWOR sont Introduction


également exprimables en XPath ?
A. For Documents XML
B. Where
Langage XQuery
C. Order by
XPath
D. Group by
Requêtes FLWOR
Répondre sur http://toreply.univ-lille1.fr Requêtes complexes

Question n° 510
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 117 Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 118

Sondage express

Que pensez-vous de ce cours ?

Répondre sur http://toreply.univ-lille1.fr


Question n° 735

Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 119

30

S-ar putea să vă placă și