Académique Documents
Professionnel Documents
Culture Documents
Master 1 Informatique
2017-2018
Jérôme Darmont
http://eric.univ-lyon2.fr/~jdarmont/
Actualité du cours
http://eric.univ-lyon2.fr/~jdarmont/?page_id=3142
http://eric.univ-lyon2.fr/~jdarmont/?feed=rss2
https://twitter.com/darmont_lyon2 #bda
Introduction
Bases du langage
Curseurs
Gestion des erreurs
Procédures stockées
SQL dynamique
Serveur
Oracle
PL/SQL
Bloc anonyme
– Stocké dans un fichier
– Compilé et exécuté à la volée
BA
Procédure stockée
– Compilée a priori
– Stockée dans la base de données Déc
BD
Déclencheur PS
– Procédure stockée associée à une table
– Exécution automatique à la suite d’un événement
[DECLARE
-- Types, constantes et variables]
BEGIN
-- Instructions PL/SQL
[EXCEPTION
-- Gestion des erreurs]
END;
Question n° 9323
Introduction
Bases du langage
Curseurs
Gestion des erreurs
Procédures stockées
SQL dynamique
Variables
ex. date_naissance DATE;
compteur INTEGER := 0; -- Initialisation
compteur2 INTEGER DEFAULT 0; -- Valeur par défaut
id CHAR(5) NOT NULL := ‘AP001’;
Constantes
ex. taux_tva CONSTANT REAL := 0.2;
Affectation simple
ex. n := 0;
n := n + 1;
Opérateurs arithmétiques + - / * **
Opérateur de concaténation ||
IF condition1 THEN
-- Statements
[ELSIF condition2 THEN
-- Instructions PL/SQL]
[ELSE
-- Instructions PL/SQL]
END IF;
CASE
CASE variable
WHEN val1 THEN -- Instruction PL/SQL
WHEN val2 THEN -- Instruction PL/SQL
WHEN val3 THEN -- Instruction PL/SQL
[ELSE -- Instruction par défaut]
END CASE;
Question n° 9809
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 25
PL/SQL : Collections
Collection entière
ex. DECLARE TYPE T1 IS TABLE OF INT;
TYPE T2 IS TABLE OF INT;
et11 T1 := T1(1, 2, 3, 4);
et12 T1 := T1(5, 6);
et2 T2 := T2();
BEGIN et12 := et11; -- Légal
et2 := et11; -- Illégal
…
33 58 22 17
1 2 3 4 5 6
Question n° 7007
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 32
PL/SQL : Enregistrements
2. Déclarer un enregistrement
ex. un_etudiant Edutiant;
Référence directe
ex. un_etudiant.numetu := 12212478;
un_etudiant.nom := 'Toto';
un_etudiant.age := 6;
Résultat de requête
ex. SELECT student_number, student_name, student_age
INTO un_etudiant
FROM student
WHERE student_number = 12212478;
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 34
PL/SQL : Procédures
BEGIN
prix_EUR := prix_USD * taux;
END;
-- Calcul de n!
BEGIN
IF n = 1 THEN -- Condition d’arrêt
RETURN 1;
ELSE
RETURN n * facto(n - 1); -- Appel récursif
END IF;
END;
-- Exemple
DECLARE
hundredBucks CONSTANT REAL := 100;
resEuro REAL;
fact10 INTEGER;
BEGIN
Conversion_USD_EUR(hundredBucks, resEuro);
fact10 := facto(10);
END;
Introduction
Bases du langage
Curseurs
Gestion des erreurs
Procédures stockées
SQL dynamique
BEGIN
FOR nuplet IN calc_TVA LOOP
DBMS_OUTPUT.PUT_LINE(
nuplet.prod_num
|| ' : ' ||
nuplet.prix_TTC);
END LOOP;
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 43
PL/SQL : Curseur explicite
DECLARE
-- Comme précédemment
BEGIN
OPEN calc_TVA;
FETCH calc_TVA INTO nuplet; -- 1re ligne
WHILE calc_TVA%FOUND LOOP
-- Instructions PL/SQL
FETCH calc_TVA INTO nuplet; -- Ligne suivante
END LOOP;
CLOSE calc_TVA;
END;
DECLARE
CURSOR c(s number) IS SELECT ename, sal FROM emp WHERE sal >= s;
nuplet c%ROWTYPE;
BEGIN
OPEN c(2500);
FETCH c INTO nuplet;
WHILE c%FOUND LOOP
DBMS_OUTPUT.PUT_LINE(nuplet.ename || ' : ' || nuplet.sal);
FETCH c INTO nuplet;
END LOOP;
CLOSE c;
END;
Question n° 6655
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 47
PL/SQL : Plan
Introduction
Bases du langage
Curseurs
Gestion des erreurs
Procédures stockées
SQL dynamique
DECLARE
c INTEGER;
personne EXCEPTION;
BEGIN
SELECT COUNT(*) INTO c FROM emp;
IF c = 0 THEN
RAISE personne;
END IF;
EXCEPTION
WHEN personne THEN
RAISE_APPLICATION_ERROR(-20501, 'Table vide !');
END; -- Code d’erreur compris entre –20999 et -20001
Introduction
Bases du langage
Curseurs
Gestion des erreurs
Procédures stockées
SQL dynamique
Oracle 8 documentation
(Fig. 8-1)
Before 1 2 3
After 4 5 6
ON nom_table
[FOR EACH ROW]
-- Bloc PL/SQL codant les actions à effectuer
Question n° 2247
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 66
PL/SQL : Plan
Introduction
Bases du langage
Curseurs
Gestion des erreurs
Procédures stockées
SQL dynamique
Exemples
– Procédure stockée qui met la table EMP à jour
SQL statique (la requête est connue à la compilation)
– Procédure stockée 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)
BEGIN
-- Requête paramétrée sur attributs (statique !)
requete := 'INSERT INTO dept VALUES (:p1, :p2, :p3)';
EXECUTE IMMEDIATE requete
USING numdep, nomdep, ville;
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 70
PL/SQL : Exemples de requêtes dynamiques (2/2)
-- Récupération d’un résultat
requete := 'SELECT * FROM emp WHERE empno = :id';
EXECUTE IMMEDIATE requete INTO nuplet USING 5560;
Question n° 6361
Introduction
Bases du langage
Curseurs
Gestion des erreurs
Procédures stockées
SQL dynamique
Introduction
Documents XML
Langage XQuery
– XPath
– Requêtes FLWOR
– Requêtes complexes
Bases de Documents
données
Moteurs de recherche
Langages de requête
Années 1990
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° 8121
Introduction
Documents XML
Langage XQuery
– XPath
– Requêtes FLWOR
– Requêtes complexes
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>
– <professeur nom="Darmont" />
A. Les éléments
B. Les attributs
Question n° 5450
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 98
XML/XQuery : Plan
Introduction
Documents XML
Langage XQuery
– XPath
– Requêtes FLWOR
– Requêtes complexes
Standardisation en cours
Soutenu par les éditeurs de SGBD (Oracle, Microsoft, IBM…)
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 100
XML/XQuery : 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>
<duree>117</duree>
<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 http://eric.univ-lyon2.fr/~jdarmont/ 101
XML/XQuery : 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> http://eric.univ-lyon2.fr/~jdarmont/ 102
XML/XQuery : Plan
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 http://eric.univ-lyon2.fr/~jdarmont/ 104
XML/XQuery : Expressions de chemins (2/3)
Un attribut donné
doc("dvd.xml")/catalogue/dvd/data(@zone)
Résultat
1222
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 d'Amélie Poulain</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° 5462
Introduction
Documents XML
Langage XQuery
XPath
– Requêtes FLWOR
– Requêtes complexes
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 http://eric.univ-lyon2.fr/~jdarmont/ 111
XML/XQuery : 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>
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
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 115
XML/XQuery : Clauses Order by et Return (1/2)
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 http://eric.univ-lyon2.fr/~jdarmont/ 117
XML/XQuery : Fonctions XPath/XQuery (1/2)
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 http://eric.univ-lyon2.fr/~jdarmont/ 121
XML/XQuery : 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>
</clients>
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 122
XML/XQuery : Jointures – Documents exemples (2/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 http://eric.univ-lyon2.fr/~jdarmont/ 125
XML/XQuery : 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 http://eric.univ-lyon2.fr/~jdarmont/ 126
XML/XQuery : Jointures de documents XML (3/3)
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° 7489
Bases de données avancées http://eric.univ-lyon2.fr/~jdarmont/ 128
XML/XQuery : Plan
Introduction
Documents XML
Langage XQuery
XPath
Requêtes FLWOR
Requêtes complexes
Question n° 2361