M1info Bda
M1info Bda
M1info Bda
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
Introduction
Bases du langage
Curseurs
Gestion des erreurs
Déclencheurs
SQL dynamique
SGBD relationnel-objet
1974 : Ingres
(INteractive Graphics REtrieval System)
2021 : v13.3
Comportement stable
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
[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
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;
Tableaux
ex. notes NUMERIC(2, 2)[];
matrice INTEGER[][];
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');
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 ||
IF condition1 THEN
-- -- Instructions PL/pgSQL
[ELSIF condition2 THEN
-- Instructions PL/pgSQL]
[ELSE
-- Instructions PL/pgSQL]
END IF;
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;
CASE
WHEN var BETWEEN val1 AND val2 THEN
-- Instructions PL/pgSQL
WHEN var BETWEEN val2 + 1 AND val3 THEN
-- Instructions PL/pgSQL
END CASE;
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 !
Question n° 494
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 26
Implémentation d’un bloc
Exécution de la fonction
ex. SELECT test(); -- La forme du résultat peut différer
SELECT * FROM test(); -- en fonction des clients PostreSQL.
-- 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;
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 factorielle(10);
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
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;
A) Curseur implicite
B) Curseur explicite
C) Curseur paramétré
Introduction
Bases du langage
Curseurs
Gestion des erreurs
Déclencheurs
SQL dynamique
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
Before 1 2 3
After 4 5 6
BEFORE | AFTER
INSERT | DELETE | UPDATE | [INSERT] [[OR] DELETE] [[OR] UPDATE]
ON nomTable
ON nomTable;
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 50
Variables systèmes des déclencheurs
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
Exemples
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.
SELECT tailleTable('EMP');
SELECT parcoursTable('EMP');
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
Introduction
Documents XML
Langage XQuery
– XPath
– Requêtes FLWOR
– Requêtes complexes
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
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
Courriel sabine.loudcher@univ-lyon2.fr
Nom
– Prénom Loudcher
– Nom de famille Sabine
Question n° 541
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 74
Pourquoi pas JSON, YAML et les BD NoSQL ?
Introduction
Documents XML
Langage XQuery
– XPath
– Requêtes FLWOR
– Requêtes complexes
Tout élément doit avoir une balise ouvrante et une balise fermante.
– 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>
Que choisir ?
– <professeur>
<nom>Darmont</nom>
</professeur>
A) Les éléments
B) Les attributs
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
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
<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>
Introduction
Documents XML
Langage XQuery
– XPath
– Requêtes FLWOR
– Requêtes complexes
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
doc("dvd.xml")/catalogue/dvd[@zone]
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 96
Prédicats XPath (2/2)
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>
A) /catalogue/dvd/prix
B) doc("dvd.xml")/catalogue/dvd/prix
C) //prix
D) /catalogue//prix
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
Résultat
<res>1</res>
<res>2</res>
<res>3</res>
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>
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>
Exemple
let $x := (1 to 5)
return <res>{$x}</res>
Résultat
<res>1 2 3 4 5</res>
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
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
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>
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>
Introduction
Documents XML
Langage XQuery
XPath
Requêtes FLWOR
Requêtes complexes
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>
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>
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>
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
Question n° 683
Bases de données avancées https://eric.univ-lyon2.fr/jdarmont/ 119