Vous êtes sur la page 1sur 44

23/08/2019

Actualité du cours

Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/?page_id=3604


Master 1 IDSM-Kharkiv
2019-2020

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


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

https://twitter.com/darmont_lyon2 #idsmbda

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

1 2

Définition Organisation en fichiers

Base de données (BD) : Collection de données cohérentes et structurées Saisie Traitement Fichier

Fichier

Etat de
Base de données Saisie Traitement sortie
Fichiers
Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 3 Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 4

3 4

1
23/08/2019

Organisation en BD Avantages de l’organisation en BD

Uniformisation de la saisie

Saisie
Standardisation des traitements
Base
+ de Traitements
données Contrôle de la validité des données
Contrôles

Partage de données entre plusieurs traitements


Etats de
sortie

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

5 6

Qu’est-ce qu’un SGBD ? Processus de conception d’une BD

Probléma-
Système de Gestion de Bases de Données : Logiciel(s) Indépendant d’un système
tique
Cahier des charges de gestion de BD (SGBD)
assurant structuration, stockage, maintenance, mise à
Spécifica-
jour et consultation des données d’une BD tions
Rédaction
Modèle
conceptuel
Exemples Analyse Famille de SGBD
Spécifique
– SGBD « bureautiques » : Access, Base, Filemaker, Paradox… Modèle
logique
SGBD particulier
– SGBD serveurs : Oracle, DB2, SQL Server, PostgreSQL, MySQL, Traduction

MariaDB… Modèle
physique
Traduction
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

7 8

2
23/08/2019

Plan du cours

Partie 1 : Modélisation conceptuelle

Partie 2 : Modélisation logique Modèle


relationnel
Partie 1
Partie 3 : Interrogation et manipulation de bases de données Modélisation conceptuelle
Partie 4 : Programmation de bases de données

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

9 10

Modèle conceptuel UML Classes et attributs

Classe : Groupe d’entités du monde réel ayant les mêmes


caractéristiques et le même comportement
Standard de l’Object Management Group ex. ETUDIANT

Ensemble de formalismes graphiques Attribut : Propriété de la classe


ex. Nom et Prénom de l’étudiant·e

Diagramme de classes
Représentation graphique :

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

11 12

3
23/08/2019

Types des attributs Instances

Type d’attribut : Objets (individus) de la classe ETUDIANT = les étudiant·es


– Nombre entier (Entier)
Nom Prénom DateNaiss Etc.
– Nombre réel (Réel) Dupont Albertine 01/06/1993 ...
– Chaîne de caractères (Chaîne) West James 03/09/1994 ...
– Date (Date) Martin Marie 05/06/1995 ...
Abidi Rachid 15/11/1995 ...
Titgoutte Justine 28/02/1996 ...
Dupont Noémie 18/09/1995 ...
Dupont Albert 23/05/1990 ...

Problème : Comment distinguer les Dupont ?


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

13 14

Identifiant (1/2) Identifiant (2/2)

Solution : Ajouter un attribut numéro d’étudiant ! Le numéro d’étudiant est un attribut identifiant.

NumEtu Nom Prénom DateNaiss Un identifiant caractérise de façon unique les instances
1110 Dupont Albertine 01/06/1993 d’une classe.
2002 West James 03/09/1994
3333 Martin Marie 05/06/1995 Convention graphique :
4042 Durand Rachid 05/11/1995 NB : Ne pas confondre avec
5552 Titgoutte Justine 28/02/1996 les attributs de classe UML
6789 Dupont Noémie 18/09/1995 dont c’est la notation usuelle
7000 Dupont Albert 23/05/1990

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

15 16

4
23/08/2019

Associations Associations récursives

Association : liaison perçue entre des classes Une classe peut être associée à elle-même, chaque
ex. Les étudiant·es passent des épreuves. instance pouvant jouer plusieurs rôles dans l’association.
ex. Employés et supérieurs hiérarchiques

Rôle : fonction de chaque


Les classes ETUDIANT et EPREUVE peuvent être qualifiées de
participantes à l’association PASSER. classe participante (+).

Degré ou arité d’une association : nombre de classes participantes.


En général : associations binaires (de degré 2).
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

17 18

Multiplicité (ou cardinalité) Associations 1-1

Définition : Indicateur qui montre combien d’instances ex. Un·e étudiant·e possède une et une seule carte Izly.
de la classe considérée peuvent être liées à une Cette dernière n’est possédée que par un·e seul·e
instance de l’autre classe participant à l’association étudiant·e.

– 1 Un et un seul
– 0..1 Zéro ou un
– 0..* ou * Zéro ou plus
– 1..* Un ou plus
– M..N De M à N (M, N entiers)
ex. 4..10 (de 4 à 10) Lire « Un·e étudiant.e possède multiplicité (1) carte Izly ».
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

19 20

5
23/08/2019

Associations 1-N Associations 0 ou 1-N

ex. Une épreuve relève d’une et une seule matière. Une ex. Un·e étudiant·e peut appartenir ou non à un groupe
matière peut donner lieu à plusieurs épreuves. de TD. Un groupe de TD réunit plusieurs étudiant·es.

NB : La multiplicité un à plusieurs (1..*) peut aussi être NB : La multiplicité un à plusieurs (1..*) peut aussi être
zéro à plusieurs (0..* ou *). zéro à plusieurs (0..* ou *).
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

21 22

Associations M-N Classes-associations

ex. Un·e étudiant·e peut passer plusieurs épreuves. Une Il est possible de caractériser une association par des
épreuve peut être passée par plusieurs étudiant·es. attributs.
ex. Un·e étudiant·e qui passe une épreuve obtient une note.

NB : Les multiplicités un à plusieurs (1..*) peuvent aussi


être zéro à plusieurs (0..* ou *).
NB : Une classe-association demeure une association.
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

23 24

6
23/08/2019

Exemple : Spécifications (1/2) Exemple : Spécifications (2/2)

Les étudiant·es sont caractérisé·es par un numéro unique, leur Les étudiant·es passent des épreuves et obtiennent une note
nom, prénom, date de naissance, rue, code postal et ville. pour chacune.

Les étudiant·es possèdent une carte Izly caractérisée par un Les épreuves sont caractérisées par un code, ainsi que la date et
numéro unique et un solde d’argent utilisable au CROUS. le lieu auxquels elles se déroulent.

Selon qu’ils ou elles sont dispensé·es ou non d’assiduité, les Chaque épreuve relève d'une matière unique (mais une matière
étudiant·es appartiennent à un groupe de TD caractérisé par un donnée peut donner lieu à plusieurs épreuves).
code unique.
Les matières sont caractérisées par un code et un intitulé.
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

25 26

Démarche de modélisation conceptuelle Exemple : Diagramme de classes

1. Identifier les classes


2. Identifier les associations entre les classes
3. Identifier les attributs de chaque classe
et de chaque classe-association

4. Identifier et souligner l’identifiant de chaque classe


5. Évaluer les multiplicités des associations
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

27 28

7
23/08/2019

Modèle logique relationnel

Modèle associé aux SGBD relationnels


(ex. Oracle, SQL Server, DB2, MySQL, Access…)

Partie 2
Objectifs du modèle relationnel
Modélisation logique – Indépendance physique
– Traitement du problème de redondance des données
– Langages non procéduraux (faciles à utiliser)
– Devenir un standard

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

29 30

Modèle
Caractéristiques des SGBD relationnels Relations et attributs relationnel

Langages d’interrogation puissants et déclaratifs Une relation R est un ensemble d’attributs {A1, A2, …, An}.
Accès orienté valeur ex. La relation EPREUVE est l’ensemble des attributs
Grande simplicité, absence de considérations physiques {CodeEpr, DateEpr, Lieu}.
Description du schéma très réduite
Chaque attribut Ai prend ses valeurs dans un domaine
LDD intégré au LMD
dom(Ai).
Grande dynamique de structure
ex. Note ∈ [0, 20]
Optimisation de requêtes Lieu ∈ {'Amphi Say', 'Amphi Aubrac', 'Salle D101', …}
Utilisation interactive ou à partir d’un langage hôte
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

31 32

8
23/08/2019

Modèle Modèle
N-uplets relationnel Contraintes d’intégrité (1/2) relationnel

Notation d’une relation : R (A1, A2, …, An) Clé primaire : Ensemble d’attributs dont les valeurs
permettent de distinguer les n-uplets les uns des autres.
ex. EPREUVE (CodeEpr, DateEpr, Lieu)
ex. CodeEpr est clé primaire de la relation EPREUVE.
Un n-uplet t est un ensemble de valeurs t = <V1, V2, …, Vn>
où Vi ∈ dom(Ai) ou bien Vi est la valeur nulle (NULL). Clé étrangère : Attribut qui est clé primaire d’une autre
relation.
ex. <'InfoS2', '30-06-2016', 'Amphi Aubrac'> est un n-uplet
ex. Connaître la matière dont relève chaque épreuve
de la relation EPREUVE.
 ajout de l’attribut CodeMat à la relation EPREUVE

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

33 34

Modèle Modèle
Contraintes d’intégrité (2/2) relationnel Contraintes d’intégrité en pratique relationnel

EPREUVE MATIERE
Notations :Clés primaires soulignées, clés étrangères
postfixées par le caractère #. CodeEpr DateEpr Lieu Codemat#
CodeMat Intitulé
ex. EPREUVE (CodeEpr, DateEpr, Lieu, CodeMat#) Amphi
ECOS101 15/01/2016 ECO
Aubrac
ECO Économie
Amphi
Contraintes de domaine : Les attributs doivent respecter ECOS102 16/01/2016
Aubrac
ECO

une condition logique. GES Gestion


GESS201 25/05/2016 Salle 201 GES
ex. Note ≥ 0 ET Note ≤ 20
INFOS101 20/01/2016 Salle 101 INFO
INFO Informatique

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

35 36

9
23/08/2019

Traduction UML-relationnel (1/4) Traduction UML-relationnel (2/4)

Chaque classe devient une relation.


Chaque association 1-1 est prise en compte en
Les attributs de la classe deviennent attributs de la incluant la clé primaire d’une des relations participante
relation. comme clé étrangère dans l’autre relation.

L’identifiant de la classe devient clé primaire de la


relation. ex. CARTE_IZLY (NumCarte, SoldeCROUS)

ETUDIANT (NumEtu, Nom, Prénom, DateNaiss, Rue,


ex. ETUDIANT (NumEtu, Nom, Prénom, DateNaiss, Rue, CP, Ville, NumCarte#)
CP, Ville)
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

37 38

Traduction UML-relationnel (3/4) Traduction UML-relationnel (4/4)

Chaque association 1-N est prise en compte en Chaque association M-N est prise en compte en créant
incluant la clé primaire de la relation dont la une nouvelle relation dont la clé primaire est la
multiplicité maximale est 1 comme clé étrangère dans concaténation des clés primaires des relations
l’autre relation participante. participantes. Les attributs de la classe-association sont
insérés dans cette nouvelle relation si nécessaire.
ex. EPREUVE (CodeEpr, DateEpr, Lieu, CodeMat#)
ex. PASSER (NumEtu#, CodeEpr#, Note)
MATIERE (CodeMat, Intitulé)

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

39 40

10
23/08/2019

Modèle Modèle
Exemple : Modèle logique relationnel relationnel Traduction d’une association M-N relationnel

ETUDIANT
CARTE_IZLY (NumCarte, SoldeCROUS)
NumEtu Nom Prénom
GROUPE_TD (CodeGroupe) 1110 Dupont Albertine PASSER (table « pont »)
2002 West James NumEtu# CodeEpr# Note
ETUDIANT (NumEtu, Nom, Prénom, DateNaiss, 1110 INFOS101 15,5
Rue, CP, Ville, NumCarte#, CodeGroupe#) EPREUVE
2002 ECOS101 8,5
CodeEpr DateEpr Lieu
MATIERE (CodeMat, Intitulé) 2002 ECOS102 13
ECOS101 15/01/2016 Aubrac
1110 GESS201 14
ECOS102 16/01/2016 Aubrac
EPREUVE (CodeEpr, DateEpr, Lieu, CodeMat#) 2002 GESS201 14,5
GESS201 25/05/2016 D201
PASSER (NumEtu#, CodeEpr#, Note) INFOS101 20/01/2016 D101
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

41 42

Modèle Modèle
Problème de la redondance relationnel Anomalies liées à la redondance relationnel

Anomalies de modification : Si l’on souhaite mettre à


Lorsque l’on effectue directement une modélisation logique jour le lieu d’une épreuve, il faut le faire pour tous les
ex. Soit la relation PASSER_EPREUVE. n-uplets concernés.
NumEtu Note CodeEpr Lieu Anomalies d’insertion : Pour ajouter une nouvelle
1110 15,5 INFOS101 Amphi Aubrac épreuve, il faut obligatoirement fournir des valeurs
1110 14,0 ECOS101 Amphi Aubrac
2002 13,0 ECOS102 Salle D201 pour NumEtu et Note.
3333 10,5 INFOS101 Amphi Aubrac
Anomalies de suppression
Cette relation présente différentes anomalies. ex. La suppression de l’étudiant n° 2002 fait perdre
toutes les informations concernant l’épreuve ECOS102.
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

43 44

11
23/08/2019

Éviter la redondance

Pourquoi ?
– Suppression des problèmes de mise à jour
– Minimisation de l’espace de stockage
Partie 3
Comment ? Interrogation
– Dans le modèle conceptuel, ne spécifier que des attributs non et manipulation
décomposables (première forme normale).
ex. Une adresse doit être décomposée en rue, code postal, ville… de bases de données
– C’est tout !
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

45 46

Modèle Modèle
Qu’est-ce que l’algèbre relationnelle ? relationnel Opérateurs ensemblistes (1/5) relationnel

Union :T = R ∪ S (notation algébrique)


Ensemble d’opérateurs qui s’appliquent aux relations ou T = UNION (R, S) (notation fonctionnelle)
R et S doivent avoir même schéma.
Résultat : nouvelle relation qui peut à son tour être ex. R et S sont les relations ETUDIANT de deux formations
manipulée (ex. anciens M1 Finance et Eco-Société) fusionnées pour
constituer une liste d’émargement commune.
L’algèbre relationnelle permet d’effectuer des recherches Notation graphique : T
dans les relations. ∪
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/ R S 48

47 48

12
23/08/2019

Modèle Modèle
Opérateurs ensemblistes (2/5) relationnel Opérateurs ensemblistes (3/5) relationnel

Intersection : T = R ∩ S Différence : T = R - S
ou T = INTERSECT (R, S) ou T = MINUS (R, S)
R et S doivent avoir même schéma. R et S doivent avoir même schéma.
ex. Permet de trouver les étudiant·es commun·es à deux ex. Permet de retirer les étudiant·es de la relation S
formations. existant dans la relation R.
T T
Notation graphique : Notation graphique :
∩ −
R S R S
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

49 50

Modèle Modèle
Opérateurs ensemblistes (4/5) relationnel Produit cartésien relationnel

NumEtu Nom CodeEprLieu


ex.
Produit cartésien : T=RxS 101 E1 X INFO1 Aubrac
102 E2 ECO1 Aubrac
ou T = PRODUCT (R, S) ECO2 D201
Associe chaque n-uplet de R à chaque n-uplet de S.
NumEtu Nom CodeEprLieu
Notation graphique :
101 E1 INFO1 Aubrac
T 102 E2 INFO1 Aubrac
101 E1 ECO1 Aubrac
x = 102 E2 ECO1 Aubrac
101 E1 ECO2 D201
R S 102 E2 ECO2 D201

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

51 52

13
23/08/2019

Modèle Modèle
Opérateurs ensemblistes (5/5) relationnel Division relationnel

Division : T=R÷S ex.


ou T = DIVISION (R, S)
NumEtu CodeEprNote
R (A1, A2, …, An) S (Ap+1, …, An) 101 INFO1 11
101 ECO1 15 CodeEprNote
T (A1, A2, …, Ap) contient tous les n-uplets tels que leur 101 ECO2 12 ÷ INFO1 11
concaténation à chacun des n-uplets de S donne toujours 102 ECO1 9 ECO2 12
un n-uplet de R. 103 INFO1 11
T 103 ECO2 12
Notation graphique : NumEtu
÷ = 101
103

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


R S 53 Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 54

53 54

Modèle Modèle
Opérateurs spécifiques (1/3) relationnel Opérateurs spécifiques (2/3) relationnel

Projection : T = Π <A, B, C> (R) Restriction : T = σ <C> (R)


ou T = PROJECT (R / A, B, C) ou T = RESTRICT (R / C)

T ne contient que les attributs A, B et C de R. T ne contient que les attributs de R qui satisfont la
ex. Noms et prénoms des étudiant·es. condition C.
ex. C = Étudiant·es qui habitent à Lyon.
Notation graphique : T
T Notation graphique :
A, B, C C
R R
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

55 56

14
23/08/2019

Modèle Modèle
Opérateurs spécifiques (3/3) relationnel Exemple de requête (1/4) relationnel

Notes des étudiant·es en précisant leurs noms


Jointure naturelle : T = R >< S (et pas seulement leurs numéros)
ou T = JOIN (R, S)
RESULTAT
Produit cartésien R x S et restriction A = B sur les
attributs A ∈ R et B ∈ S. Nom,
f
CodeEpr, Note
Hh
Notation graphique : T
A B NumEtu
=
NumEtu
=
R S ETUDIANT PASSER

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

57 58

Modèle Modèle
Exemple de requête (2/4) relationnel Exemple de requête (3/4) relationnel

Décomposition des opérations E.NumEtu Nom P.NumEtu CodeEpr Note


101 E1 101 INFO1 10
102 E2 101 INFO1 10
ETUDIANT PASSER 103 E3 101 INFO1 10
NumEtu Nom NumEtu CodeEpr Note 101 E1 103 INFO1 15
102 E2 103 INFO1 15
101 E1
X
101 INFO1 10 = 103 E3 103 INFO1 15
102 E2 103 INFO1 15
103 E3 103 ECO1 12 101 E1 103 ECO1 12
102 E2 103 ECO1 12
103 E3 103 ECO1 12

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

59 60

15
23/08/2019

Modèle
Exemple de requête (4/4) relationnel Classification des SGBD relationnels
ETUDIANT PASSER
Niveau 1 : Systèmes non relationnels.
E.NumEtu Nom P.NumEtu CodeEpr Note Supportent uniquement la structure tabulaire.
101 E1 101 INFO1 10
103 E3 103 INFO1 15 Niveau 2 : Systèmes relationnellement minimaux.
103 E3 103 ECO1 12 Permettent les opérations de restriction, projection et
jointure.
Π <Nom, CodeEpr, Note> (ETUDIANT PASSER)
Niveau 3 : Systèmes relationnellement complets.
Nom CodeEpr Note Toutes les opérations de l’algèbre relationnelle.
E1 INFO1 10 (Projection sur les attributs
E3 INFO1 15 Nom, CodeEpr et Note) Niveau 4 : Systèmes relationnellement pleins.
E3 ECO1 12 Permettent la définition des contraintes d’intégrité.
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

61 62

Qu’est-ce que SQL ? Types de données principaux LDD

Structured Query Language NUMBER(n) : nombre entier à n chiffres


Issu de SEQUEL (Structured English as a Query Language)
LDD LMD LCD NUMBER(n, m) : nombre réel à n chiffres au total (virgule
Permet la définition, la manipulation et le contrôle d’une comprise) et m chiffres après la virgule
base de données relationnelle.
VARCHAR(n) : chaîne de caractères de taille n
SQL se base sur l’algèbre relationnelle.

Standard depuis 1986. DATE : date au format ‘JJ-MM-AAAA’


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

63 64

16
23/08/2019

Contraintes d’intégrité LDD Définition des données (1/2) LDD

Mot clé CONSTRAINT ex.

Identification par un nom de contrainte CREATE TABLE Etudiant ( NumEtu NUMBER(8),


Nom VARCHAR(255),
Clé primaire : Prenom VARCHAR(255),
PRIMARY KEY (clé) DateNaiss DATE,
Rue VARCHAR(255),
Clé étrangère : CP NUMBER(5),
FOREIGN KEY (clé) REFERENCES table(attribut) Ville VARCHAR(255),

Contrainte de domaine : CONSTRAINT EtuClePri PRIMARY KEY (NumEtu) )


CHECK (condition)
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

65 66

Définition des données (2/2) LDD Modifications structurelles (1/2) LDD


ex.
CREATE TABLE Passer ( NumEtu NUMBER(8),
Ajout d’attributs
CodeEpr VARCHAR(10),
ALTER TABLE nom_table ADD (attribut TYPE, …)
Note NUMBER(5, 2), ex. ALTER TABLE Etudiant ADD (tel NUMBER(8))

CONSTRAINT PassClePri PRIMARY KEY (NumEtu, CodeEpr), Modifications d’attributs


ALTER TABLE nom_table MODIFY (attribut TYPE, …)
CONSTRAINT PassCleEtrEtu FOREIGN KEY (NumEtu)
ex. ALTER TABLE Etudiant MODIFY (tel NUMBER(10))
REFERENCES Etudiant (NumEtu),

CONSTRAINT PassCleEtrEpr FOREIGN KEY (CodeEpr)


Suppression d'attributs
REFERENCES Epreuve (CodeEpr), ALTER TABLE nom_table DROP COLUMN attribut, ...
ex. ALTER TABLE Etudiant DROP COLUMN tel
CONSTRAINT NoteValide CHECK (Note >= 0 AND Note <= 20)
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

67 68

17
23/08/2019

Modifications structurelles (2/2) LDD Index LDD

Ajout de contrainte
ALTER TABLE nom_table
ADD CONSTRAINT nom_contrainte définition_contrainte
ex. ALTER TABLE Epreuve
ADD CONSTRAINT LieuValide CHECK (Lieu IN (‘Say’, ‘Aubrac’)) Définition : Structure de données physique permettant
d'accélérer les accès aux données
Suppression de contrainte
ALTER TABLE nom_table DROP CONSTRAINT nom_contrainte Exemple : CREATE INDEX IdxNomEtu ON Etudiant (Nom)
ex. ALTER TABLE Epreuve
DROP CONSTRAINT LieuValide
NB : La clé primaire d'une relation est automatiquement
indexée.
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

69 70

Vues LDD Intérêt des vues (1/2) LDD

Définition : Une vue est une table virtuelle calculée à


Simplification de l’accès aux données
partir d’autres tables grâce à une requête.
en masquant les opérations de jointure
ex. CREATE VIEW notesParEtudiant AS
Création d’une vue SELECT E.NumEtu, Nom, Prenom, NumEpr, Note
FROM Etudiant E, Passer P
CREATE VIEW nom_vue AS requête WHERE E.NumEtu = P.NumEtu

ex. CREATE VIEW lesNoms AS SELECT NumEtu, Nom FROM notesParEtudiant


SELECT Nom, Prenom FROM Etudiant WHERE Note > 10

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

71 72

18
23/08/2019

Intérêt des vues (2/2) LDD Mise à jour via une vue LDD

Sauvegarde indirecte de requêtes complexes Le mot clé DISTINCT doit être absent de la requête.
Présentation de mêmes données sous
différentes formes adaptées aux différents usagers particuliers
La clause FROM doit faire référence à une seule table.
Support de l’indépendance logique
ex. Si la table Etudiant est remaniée, la vue notesParEtudiant doit
être refaite, mais les requêtes qui utilisent cette vue n’ont pas à être La clause SELECT doit faire référence directement aux
remaniées. attributs de la table concernée (pas d’attribut dérivé).
Renforcement de la sécurité des données par masquage des lignes
et des colonnes sensibles aux usagers non habilités
Les clauses GROUP BY et HAVING sont interdites.
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

73 74

Vues systèmes LDD Exemples d’interrogation des vues systèmes LDD


ALL_TABLES (OWNER, TABLE_NAME, …)
Tables qui contiennent un attribut Intitulé
ALL_VIEWS (OWNER, VIEW_NAME, …)
SELECT TABLE_NAME FROM USER_TAB_COLUMNS
ALL_CONSTRAINTS (OWNER, TABLE_NAME, CONSTRAINT_NAME, WHERE COLUMN_NAME = ‘INTITULE’
CONSTRAINT_TYPE, SEARCH_CONDITION, ...)
ALL_CONS_COLUMNS (OWNER, TABLE_NAME, CONSTRAINT_NAME, Attributs de la table Client
COLUMN_NAME, ...)
SELECT COLUMN_NAME FROM USER_TAB_COLUMNS
USER_CATALOG (TABLE_NAME, TABLE_TYPE) WHERE TABLE_NAME = ‘CLIENT’

USER_TAB_COLUMNS (TABLE_NAME, COLUMN_NAME, …)


Contraintes des tables de l’utilisateur courant
USER_IND_COLUMNS (INDEX_NAME, TABLE_NAME, COLUMN_NAME, …)
SELECT TABLE_NAME, CONSTRAINT_NAME
USER_CONSTRAINTS (TABLE_NAME, CONSTRAINT_NAME, CONSTRAINT_TYPE,
SEARCH_CONDITION, ...)
Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/
... 75
FROM ALL_CONSTRAINTS
WHERE OWNER = USER
Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 76

75 76

19
23/08/2019

Mise à jour des données LMD Interrogation des données LMD

Ajout d’un n-uplet


ex. INSERT INTO Matiere Par l’exemple, sur la base ETUDIANTS
VALUES (‘BDM1MBFA’, ‘Bases de données’)
CARTE_IZLY (NumCarte, SoldeCROUS)
Modification de la valeur d’un attribut GROUPE_TD (CodeGroupe)
ex. UPDATE Etudiant SET Nom=‘Dudule’ ETUDIANT (NumEtu, Nom, Prénom, DateNaiss, Rue, CP, Ville,
WHERE NumEtu = 333333 NumCarte#, CodeGroupe#)
ex. UPDATE Passer SET Note = Note + 1 MATIERE (CodeMat, Intitulé)
EPREUVE (CodeEpr, DateEpr, Lieu, CodeMat#)
Suppression de n-uplets PASSER (NumEtu#, CodeEpr#, Note)
ex. DELETE FROM Etudiant
WHERE Ville = ‘Lyon’ Note : Les symboles [ ] indiquent une clause optionnelle d’une requête
ex. DELETE FROM Epreuve dans les transparents suivants.
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

77 78

Étoile, tri et champ calculé LMD Projection et restriction LMD

Tous les n-uplets d’une table : étoile (*) Projection


ex. SELECT * FROM Etudiant ex. Noms et Prénoms des étudiant·es, uniquement (pas les
autres attributs)
Tri du résultat SELECT Nom, Prénom FROM Etudiant
ex. Par ordre alphabétique [inverse] de nom
Suppression des doublons
SELECT * FROM Etudiant
ex. SELECT DISTINCT Nom FROM Etudiant
ORDER BY Nom [DESC]
Restriction
Champs calculés ex. Étudiant·es qui habitent à Lyon
ex. Transformation de notes sur 20 en notes sur 10 SELECT * FROM Etudiant
SELECT Note / 2 FROM Passer WHERE Ville = ‘Lyon’
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

79 80

20
23/08/2019

Opérateurs de restriction (1/3) LMD Opérateurs de restriction (2/3) LMD

ex. Épreuves se déroulant après le 01/01/2016


SELECT * FROM Epreuve ex. Étudiant·es habitant une ville dont le nom se
WHERE DateEpr >= '01-01-2016' termine par sur-Saône
ex. Notes comprises entre 10 et 20 SELECT * FROM Etudiant
SELECT * FROM Passer WHERE Ville LIKE ‘%sur-Saône’
WHERE Note BETWEEN 10 AND 20
‘sur-Saône%’  commence par sur-Saône
ex. Notes indéterminées (sans valeur) ‘%sur%’  contient le mot sur
SELECT * FROM Passer
WHERE Note IS NULL
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

81 82

Opérateurs de restriction (3/3) LMD Opérateurs logiques LMD

ex. Prénoms des étudiant·es dont le nom est ET. ex. Épreuves se déroulant le 15/01/2016 en salle D201
Dupont, Durand ou Martin SELECT * FROM Epreuve
WHERE DateEpr = ‘15-01-2016’ AND Lieu = ‘D201’
SELECT Prénom FROM Etudiant OU. ex. Étudiant·es né·es avant 1990 ou habitant hors Lyon
WHERE Nom IN (‘Dupont’, ‘Durand’, ’Martin’) SELECT * FROM Etudiant
WHERE DateNaiss < ‘01-01-1990’ OR Ville <> ‘Lyon’
Combinaisons. ex. Étudiant·es né·es après 1990 et habitant Lyon
NB : Possibilité d’utiliser la négation pour tous ces prédicats ou Vienne
 NOT BETWEEN, NOT NULL, NOT LIKE, NOT IN. SELECT * FROM Etudiant
WHERE DateNaiss > ‘31-12-1990’
AND (Ville = ‘Lyon’ OR Ville = ‘Vienne’)
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

83 84

21
23/08/2019

Fonctions d’agrégat LMD Fonction COUNT et opérateur DISTINCT LMD

Elles opèrent sur un ensemble de valeurs et les agrègent.


AVG(), VARIANCE(), STDDEV() : moyenne, variance et ex. Nombre total de notes
écart-type des valeurs
SELECT COUNT(*) FROM Passer
SUM() : somme des valeurs SELECT COUNT(NumEtu) FROM Passer

MIN(), MAX() : valeur minimum, valeur maximum


ex. Nombre d'étudiant·es noté·es
COUNT() : nombre de valeurs
SELECT COUNT(DISTINCT NumEtu) FROM Passer
ex. Moyenne des notes
SELECT AVG(Note) FROM Passer
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

85 86

Exemple COUNT/DISTINCT LMD Jointure (1/3) LMD

Table PASSER ex. Liste des notes avec le nom des étudiant·es
NumEtu CodeEpr Note
101 INFO1 10 SELECT Nom, CodeEpr, Note
RESULTAT
103 INFO1 15 FROM Etudiant, Passer
103 ECO1 12
Nom,
f
WHERE Etudiant.NumEtu = Passer.NumEtu
CodeEpr, Note
Hh

COUNT(NumEtu)  Résultat = 3 NumEtu NumEtu


=
COUNT(DISTINCT NumEtu)  Résultat = 2
ETUDIANT PASSER

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

87 88

22
23/08/2019

Jointure (2/3) LMD Jointure (3/3) LMD

ex. Idem avec le numéro d'étudiant en plus Jointure exprimée avec le prédicat IN
SELECT E.NumEtu, Nom, CodeEpr, Note ex. Notes des épreuves passées le 23 septembre 2016
FROM Etudiant E, Passer P
SELECT Note FROM Passer
WHERE E.NumEtu = P.NumEtu
WHERE CodeEpr IN (
ORDER BY Nom, Note DESC Sous-
SELECT CodeEpr FROM Epreuve requête
WHERE DateEpr = ‘23-09-2016’)
NB : Utilisation d’alias (E et P) pour alléger l’écriture
+ tri par nom (croissant) et note (décroissante). NB : Il est possible d’imbriquer des requêtes.
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

89 90

Prédicats d’existence LMD Prédicats de dénombrement LMD

Prédicats ALL / ANY


Prédicats EXISTS / NOT EXISTS
ex. Étudiant·es qui ont passé au moins une épreuve ex. Numéros des étudiant·es qui ont obtenu au moins
[n’ont passé aucune épreuve] une note supérieure à chacune [à au moins une] des
notes obtenues par l'étudiant·e n° 1000.
SELECT * FROM Etudiant E
SELECT DISTINCT NumEtu FROM Passer
WHERE [NOT] EXISTS ( WHERE Note > ALL [ANY] (
SELECT * FROM Passer P SELECT Note FROM Passer
WHERE E.NumEtu = P.NumEtu ) WHERE NumEtu = 1000 )
Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 91 Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 92

91 92

23
23/08/2019

Groupement (1/2) LMD Groupement (2/2) LMD


ex. Note moyenne pour les étudiant·es ayant passé moins
ex. Moyenne de chaque étudiant·e de 5 épreuves
SELECT NumEtu, AVG(Note) SELECT NumEtu, AVG(Note)
FROM Passer FROM Passer
GROUP BY NumEtu GROUP BY NumEtu
HAVING COUNT(*) < 5
ex. Nombre de notes par étudiant·e
Attention : La clause HAVING ne s’utilise qu’avec GROUP BY.
SELECT NumEtu, COUNT(*)
FROM Passer NB : HAVING : évaluation de condition sur un résultat
GROUP BY NumEtu de groupement (a posteriori)
≠ WHERE : évaluation de condition a priori
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

93 94

Division LMD Solution logique LMD

SELECT NumEtu
Ex. Numéro des étudiant·es qui ont passé toutes les épreuves FROM Etudiant Et
WHERE NOT EXISTS (
NB : Il n'existe pas d'opérateur de division en SQL ! SELECT *
FROM Epreuve Ep
Deux stratégies :
WHERE NOT EXISTS (
– Étudiant·es tels qu'il n'existe pas d’épreuve tel qu'il n'existe pas de SELECT *
« passage » pour cet étudiant·e et cette épreuve. FROM Passer P
– Étudiant·es qui ont passé un nombre distinct d’épreuves égal au WHERE Et.NumEtu = P.NumEtu
nombre total d’épreuves. AND P.CodeEpr = Ep.CodeEpr ) )
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

95 96

24
23/08/2019

Solution par comptage LMD Opérations ensemblistes LMD

SELECT NumEtu FROM Etudiant E INTERSECT, MINUS, UNION


WHERE ( SELECT COUNT(CodeEpr)
FROM Passer P ex. Code des épreuves ayant soit lieu dans l’Amphi
WHERE E.NumEtu = P.NumEtu ) Aubrac, soit ayant été passées par l'étudiant·e n° 102
= ( SELECT COUNT(*) FROM Epreuve )
ou SELECT CodeEpr FROM Epreuve
SELECT NumEtu FROM Passer WHERE Lieu = 'Amphi Aubrac‘
GROUP BY NumEtu UNION
SELECT CodeEpr FROM Passer
HAVING COUNT(CodeEpr) = WHERE NumEtu = 102
( SELECT COUNT(*) FROM Epreuve )
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

97 98

Requêtes hiérarchiques (1/5) LMD Requêtes hiérarchiques (2/5) LMD

Exemple de hiérarchie Vélo ex. Structure hiérarchique des éléments à partir de la racine
(nomenclature) :
Cadre Roues
SELECT Dési FROM Element
Relation associée : CONNECT BY Parent = PRIOR No_Elt
ELEMENT (No_Elt, Dési, Parent#) Pneu Rayons START WITH Parent IS NULL;
0 Vélo NULL
1 Cadre 0
2 Roue1 0 6 Rayon11 2
3 Roue2 0 7 Rayon12 2
Racine de la Ordre de parcours de
4 Pneu1 2 8 Rayon13 2 hiérarchie la hiérarchie
5 Pneu2 3 9 Rayon21 3
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

99 100

25
23/08/2019

Requêtes hiérarchiques (3/5) LMD Requêtes hiérarchiques (4/5) LMD

ex. Idem avec élagage d’une branche de la hiérarchie


ex. Idem avec indication du niveau dans la hiérarchie
SELECT LEVEL, Dési FROM Element
SELECT LEVEL, Dési FROM Element CONNECT BY Parent = PRIOR No_Elt AND Dési <> ‘Roue2'
CONNECT BY Parent = PRIOR No_Elt
START WITH Parent IS NULL;
START WITH Parent IS NULL;

Résultat : 1 Velo 3 Rayon12 Résultat : 1 Velo 3 Rayon12


2 Cadre 3 Rayon13
2 Cadre 3 Rayon13
2 Roue1 2 Roue2 2 Roue1 2 Roue2
3 Pneu1 3 Pneu2
3 Pneu1
3 Rayon11 3 Rayon21 3 Rayon11
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

101 102

Requêtes hiérarchiques (5/5) LMD Fonctions SQL (1/2) LMD

– ABS(n) : Valeur absolue de n – LOWER(ch) : c en minuscules


ex. Nombre d'éléments dans chaque niveau – CEIL(n) : Plus petit entier ≥ n – UPPER(ch) : c en majuscules
– FLOOR(n) : Plus grand entier ≤ n – LTRIM(ch, n) : Troncature à gauche
Il est possible d'utiliser le groupement. – MOD(m, n) : Reste de m/n – RTRIM(ch, n) : Troncature à droite
– REPLACE(ch, car) : Remplacement de
– POWER(m, n) : mn caractère
SELECT LEVEL, COUNT(No_Elt) – SIGN(n) : Signe de n – SUBSTR(ch, pos, lg) : Extraction de chaîne
FROM Element – SQRT(n) : Racine carrée de n – SOUNDEX(ch) : Représentation phonétique
CONNECT BY Parent = PRIOR No_Elt de ch
– ROUND(n, m) : Arrondi à 10-m
START WITH Parent IS NULL – LPAD(ch, lg, car) : Compléter à gauche
– TRUNC(n, m) : Troncature à 10-m
GROUP BY LEVEL; – RPAD(ch, lg, car) : Compléter à droite
– CHR(n) : Caractère ASCII n° n
– INITCAP(ch) : 1re lettre en maj.
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

103 104

26
23/08/2019

Fonctions SQL (2/2) LMD Exemples d’appels de fonctions LMD


– ASCII(ch) : Valeur ASCII de ch – TO_NUMBER(ch) : Conversion de ch
– INSTR(ch, ssch) : Recherche de en nombre
SELECT UID, USER FROM DUAL;
ssch dans ch – TO_CHAR(x) : Conversion de x en
– LENGTH(ch) : Longueur de ch chaîne
– ADD_MONTHS(dte, n) : Ajout de n – TO_DATE(ch) : Conversion de ch en SELECT GREATEST(1, 2, 3) FROM DUAL;
mois à dte date
– LAST_DAY(dte) : Dernier jour du – NVL(x, val) : Remplace par val si x a SELECT Nom, Prenom,
mois la valeur NULL FLOOR( MONTHS_BETWEEN(SYSDATE, DateNaiss) / 12) Age
– MONTHS_BETWEEN(dt1, dt2) : – GREATEST(n1, n2…) : + grand FROM Etudiant;
Nombre de mois entre dt1 et dt2 – LEAST (n1, n2…) : + petit
– NEXT_DAY(dte) : Date du – UID : Identifiant numérique de

...
lendemain l’utilisateur
UPDATE Passer SET Note = NVL(Note, 10);
– SYSDATE : Date/heure système – USER : Nom de l’utilisateur
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

105 106

Gestion des transactions LCD Contrôle des transactions LCD

Transaction : ensemble de mises à jour des données


(≠ modifications structurelles)
Validation (et fin) d’une transaction :
Début de transaction : début de la session de travail ou COMMIT
fin de la transaction précédente
Validation Validation
Connexion ou annulation ou annulation Déconnexion
Annulation (et fin) d’une transaction :
ROLLBACK

Transaction 1 Transaction 2 Transaction 3


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

107 108

27
23/08/2019

Utilisateurs LCD Privilèges globaux LCD

Droit d'effectuer une action sur les objets de


Création l'utilisateur seulement
– ex. CREATE USER moi_meme
IDENTIFIED BY mon_mot_de_passe – ex. CREATE TABLE
ALTER INDEX
DROP VIEW
Suppression
– ex. DROP USER moi_meme CASCADE Droit d'effectuer une action dans tous les schémas de
la base de données
Modification – ex. CREATE ANY TABLE
– ex. ALTER USER moi_meme IDENTIFIED BY aaaaa ALTER ANY INDEX
DROP ANY VIEW
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

109 110

Privilèges sur les objets BD LCD Rôles LCD

Privilège Signification Tables Vues


ALTER Destruction X Rôles prédéfinis
DELETE Suppression X X – CONNECT : droit de création de tables, vues, synonymes, etc.
INDEX Construction X – RESOURCE : droit de création de procédures stockées,
déclencheurs, etc.
INSERT Insertion X X
– DBA : administrateur de la BD
REFERENCES Clé étrangère X
SELECT Lecture X X Création de nouveaux rôles
UPDATE Mise à jour X X – ex. CREATE ROLE role1
ALL Tous X X
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

111 112

28
23/08/2019

Attribution de privilèges LCD Révocation de privilèges LCD


Transmission de privilèges Suppression de privilèges
GRANT privilège ON table|vue
REVOKE privilège ON table|vue FROM user|PUBLIC
TO user|PUBLIC [WITH GRANT OPTION]
Privilèges sur des objets
Privilèges sur des objets – ex. REVOKE SELECT ON ma_table FROM toto
– ex. GRANT SELECT ON ma_table TO toto
– ex. REVOKE SELECT ON ma_table FROM PUBLIC
– ex. GRANT SELECT ON ma_table TO PUBLIC – ex. REVOKE SELECT ON ma_table FROM role1
– ex. GRANT SELECT ON ma_table TO role1
Privilèges globaux et rôles
Privilèges globaux et rôles – ex. REVOKE CREATE ANY TABLE FROM toto
– ex. GRANT CREATE ANY TABLE TO toto – ex. REVOKE CONNECT, RESOURCE FROM toto
– ex. GRANT CONNECT, RESOURCE TO toto – ex. REVOKE role1 FROM toto
– ex. GRANT role1 TO toto
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

113 114

Tutoriel SQL

Pour approfondir SQL en ligne…

Partie 4
Programmation
de bases de données

http://eric.univ-lyon2.fr/jdarmont/tutoriel-sql/
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

115 116

29
23/08/2019

Requêtes SQL dans un programme Caractéristiques du langage PL/SQL (1/2)

SQL encapsulé : Requêtes SQL incorporées dans le code source Langage de 4e génération (L4G = L3G + syntaxe type SQL)
(PL/SQL, T-SQL, PL/pgSQL, Pro*C…) C Conçu comme une extension de SQL
API : Requêtes SQL via des fonctions du langage U
R
Déclaration de variables et de constantes
(Java Persistence API, PHP Data Objects…)
S Types abstraits (collections, enregistrements, objets)
Interfaces de niveau appel : intergiciel entre le langage et le SGBD
E
(ODBC, JDBC, ADO…) Modularité (sous-programmes, paquetages)
U
Procédures stockées : Fonctions SQL stockées dans la base de R Gestion des erreurs (Gestion des erreurs)
données et exécutées par le SGBD S
(écrites en PL/SQL, T-SQL, PL/pgSQL) Interaction étroite avec Oracle/SQL (types identiques)
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

117 118

Caractéristiques du langage PL/SQL (2/2) Architecture d’Oracle

SQL dynamique (construction de requêtes à la volée) Génie logiciel Réseau

Programmation orientée objet SQL


SQL Developer

Performance (traitement par lots) Serveur


Oracle
Productivité (uniformité des outils Oracle)

Portabilité (sur tous systèmes Oracle) PL/SQL

Sécurité (procédures stockées, déclencheurs) Logiciels tiers Administration

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

119 120

30
23/08/2019

Moteur Oracle Types de blocs


Bloc anonyme
– Stocké dans un fichier
– Compilé et exécuté à la volée
BA

Oracle Database PL/SQL


Procédure stockée
User’s Guide and Reference – Compilée a priori
Déc
– Stockée dans la base de données
BD
PS
Déclencheur
– Procédure stockée associée à une table
– Exécution automatique à la suite d’un événement
Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 121 Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 122

121 122

Structure d’un bloc Variables et constantes

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


-- Types, constantes et variables]
Variables
BEGIN ex. date_naissance DATE;
-- Instructions PL/SQL 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. taux_tva CONSTANT REAL := 0.2;

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

123 124

31
23/08/2019

Types de données Référencer un type existant

Type d’une autre variable


ex. credit REAL;
debit credit%TYPE;
Oracle Database PL/SQL
User’s Guide and Reference Type de l’attribut d’une table À utiliser
ex. num_emp EMP.EMPNO%TYPE; au maximum !

Type des n-uplets d’une table


ex. un_etudiant STUDENT%ROWTYPE;
Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 125 Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 126

125 126

Affectation de variable Opérateurs arithmétiques et logiques


Affectation simple
Opérateurs arithmétiques + - / * **
ex. n := 0;
n := n + 1;
Opérateur de concaténation ||
Valeur de la base de données
Opérateurs de comparaison = < > <= >= <>
ex. SELECT custname INTO nom_client IS NULL LIKE BETWEEN IN
FROM customer WHERE custnum = 10;
SELECT ename, sal INTO nom, salaire Opérateurs logiques AND OR NOT
FROM emp WHERE empno = 5000;
Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 127 Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 128

127 128

32
23/08/2019

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

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

IF condition1 THEN CASE variable


-- Statements WHEN val1 THEN -- Instruction PL/SQL
[ELSIF condition2 THEN WHEN val2 THEN -- Instruction PL/SQL
-- Instructions PL/SQL]
[ELSE WHEN val3 THEN -- Instruction PL/SQL
-- Instructions PL/SQL] [ELSE -- Instruction par défaut]
END IF; END CASE;
Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 129 Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 130

129 130

Boucles Affichage écran


Pour DBMS_OUTPUT.PUT('chaîne'); /* Pas de retour à la ligne */
FOR iterateur IN [REVERSE] min..max LOOP DBMS_OUTPUT.PUT_LINE('chaîne'); /* Retour à la ligne */
-- Instructions PL/SQL
END LOOP; DBMS_OUTPUT.PUT('Hello world !');
DBMS_OUTPUT.PUT_LINE('nom = ' || nom);
Tant que DBMS_OUTPUT.PUT_LINE('n = ' || TO_CHAR(n));
WHILE condition LOOP DBMS_OUTPUT.PUT_LINE('n = ' || n);
-- Instructions PL/SQL
END LOOP; NB : Pour que l’affichage fonctionne, il faut mettre la variable d’environnement
SERVEROUTPUT à ON.
Répéter
LOOP SET SERVEROUTPUT ON dans SQL Developer
-- Instructions PL/SQL
EXIT WHEN condition; En cas de dépassement, la taille du tampon d’affichage doit être augmentée.
END LOOP; ex. DBMS_OUTPUT.ENABLE(10000);
Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 131 Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 132

131 132

33
23/08/2019

Exemple de bloc anonyme Collections


-- Calcul de prix TTC
Définition : Ensemble ordonné d’éléments de même type. Chaque
DECLARE élément est indexé par sa position dans la collection.
taux_tva CONSTANT REAL := 0.2;
prix product.prod_price%TYPE; Deux types de collections
BEGIN – Tableau (VARRAY) : taille bornée, dense
-- Affectation du prix – Liste (TABLE) : taille extensible, non-dense
SELECT prod_price INTO prix FROM product
WHERE prod_code = 'Pr345blue';
-- Ajout de la TVA
prix := prix * (1 + taux_tva); Oracle Database PL/SQL
User’s Guide and Reference
-- Affichage écran
DBMS_OUTPUT.PUT_LINE(prix || ' euros');
END;
Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 133 Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 134

133 134

Déclaration de collection Affectation de collection

1. Déclarer un type collection Collection entière


ex. TYPE Liste_Chaines IS TABLE OF VARCHAR(20); ex. DECLARE TYPE T1 IS TABLE OF INT;
TYPE Tableau_Entiers IS VARRAY(10) OF INTEGER; TYPE T2 IS TABLE OF INT;
et11 T1 := T1(1, 2, 3, 4);
et12 T1 := T1(5, 6);
2. Déclarer une collection et l’initialiser
et2 T2 := T2();
ex. ma_liste Liste_Chaines := Liste_Chaines('Aa', 'Bb', 'Cc');
BEGIN et12 := et11; -- Légal
t Tableau_Entiers := Tableau_Entiers(); et2 := et11; -- Illégal

NB : Une collection peut être déclarée vide (c’est le cas de t).
Il n’est pas obligatoire d’initialiser tous les éléments d’un tableau. Elément d’une collection
ex. et11(1) := 10;

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

135 136

34
23/08/2019

Manipulation de collection (1/2) Manipulation de collection (2/2)


TRIM(n) supprime n éléments en fin de collection (la taille de la
Ensemble de méthodes (≈ procédures) collection diminue automatiquement).
Usage: nom_collection.nom_methode[(paramètres)] TRIM ⇔ TRIM(1)

EXISTS(i) renvoie TRUE si le ie élément existe dans la collection. DELETE(i) et DELETE suppriment respectivement le ie élément et tous
les éléments de la collection (listes seulement).
COUNT renvoie le nombre d’éléments dans la collection.
FIRST et LAST renvoient respectivement l’index du premier et du
dernier élément de la collection.
LIMIT renvoie la taille maximum de la collection (NULL pour les listes). NB : FIRST = 1 et LAST = COUNT dans un tableau.

EXTEND(n) augmente la taille de la collection de n. PRIOR(i) et NEXT(i) renvoient respectivement l’index de l’élément
EXTEND(1) ⇔ EXTEND précédent et de l’élément suivant du ie élément.
Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 137 Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 138

137 138

Exemple de manipulation de collection Enregistrements


DECLARE Définition : Ensemble de données liées stockées dans
TYPE ListeEntiers IS TABLE OF INTEGER;
pile ListeEntiers := ListeEntiers();
des champs.
element INTEGER;
BEGIN 1. Déclarer un type enregistrement
-- On empile les valeurs 1 et 11 ex. TYPE Etudiant IS RECORD(
pile.EXTEND; numetu INTEGER,
pile(pile.COUNT) := 1; nom VARCHAR(50),
pile.EXTEND;
age INTEGER );
pile(pile.COUNT) := 11;
-- On dépile
element := pile(pile.COUNT); -- element = 11 2. Déclarer un enregistrement
pile.TRIM; -- Suppression en haut de pile ex. un_etudiant Edutiant;
Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 139 Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 140

139 140

35
23/08/2019

Affectation d’enregistrement Procédures


Référence directe
ex. un_etudiant.numetu := 12212478;
un_etudiant.nom := 'Toto'; PROCEDURE nom_proc (param1, param2…) IS
un_etudiant.age := 6; -- Déclarations locales (pas de clause DECLARE)
un_etudiant := mon_etudiant; -- équivalent à Etudiant%ROWTYPE BEGIN
-- Instructions PL/SQL
Résultat de requête [EXCEPTION
ex. SELECT student_number, student_name, student_age -- Gestion des exceptions]
INTO un_etudiant END;
FROM student
WHERE student_number = 12212478;
Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 141 Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 142

141 142

Fonctions Déclaration et paramétrage de sous-programmes

Déclaration : Tout sous-programme doit être défini avant


FUNCTION nom_fonction (param1, param2…) d’être appelé.
RETURN type_valeur_retour IS  définition dans la section DECLARE d’un bloc PL/SQL
-- Déclarations locales
BEGIN Définition et mode de passage des paramètres
-- Instructions PL/SQL
RETURN valeur_retour; nom_param [IN | OUT | IN OUT] TYPE
[EXCEPTION ex. resultat OUT REAL
-- Gestion des exceptions]
END; – IN: Paramètre d’entrée (lecture seule / par valeur)
– OUT: Paramètre de sortie (écriture seule / par référence)
– IN OUT: Paramètre d’entrée-sortie (lecture-écriture / par référence)
Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 143 Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 144

143 144

36
23/08/2019

Exemple de procédure Exemple de fonction (récursive)

-- Calcul de n!
PROCEDURE Conversion_USD_EUR (prix_USD IN REAL,
FUNCTION facto (n INTEGER) RETURN INTEGER IS
prix_EUR OUT REAL) IS
BEGIN
taux CONSTANT REAL := 0.89;
IF n = 1 THEN -- Condition d’arrêt
RETURN 1;
BEGIN
ELSE
prix_EUR := prix_USD * taux;
RETURN n * facto(n - 1); -- Appel récursif
END;
END IF;
END;

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

145 146

Appel de sous-programmes Création de curseur

-- Exemple
DECLARE Définition : Structure de données qui stocke le résultat d’une
hundredBucks CONSTANT REAL := 100; requête retournant plusieurs n-uplets.
resEuro REAL;
fact10 INTEGER; Déclaration : CURSOR nom_curseur IS requete_SQL;
ex. CURSOR calc_TVA IS
BEGIN SELECT prod_num, price * 1.2 AS prix_TTC
Conversion_USD_EUR(hundredBucks, resEuro); FROM product;
fact10 := facto(10);
END; NB : Les n-uplets du curseur sont de type calc_TVA%ROWTYPE.
Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 147 Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 148

147 148

37
23/08/2019

Curseur implicite Curseur explicite


-- Parcours complet du curseur
DECLARE -- Parcours ad hoc du curseur
CURSOR calc_TVA IS
DECLARE
SELECT prod_num, price * 1.2 AS prix_TTC -- Comme précédemment
FROM product;
nuplet calc_TVA%ROWTYPE; BEGIN
OPEN calc_TVA;
BEGIN FETCH calc_TVA INTO nuplet; -- 1re ligne
FOR nuplet IN calc_TVA LOOP WHILE calc_TVA%FOUND LOOP
DBMS_OUTPUT.PUT_LINE( -- Instructions PL/SQL
FETCH calc_TVA INTO nuplet; -- Ligne suivante
nuplet.prod_num
END LOOP;
|| ' : ' || CLOSE calc_TVA;
nuplet.prix_TTC); END;
END LOOP;
Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 149 Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 150

149 150

Attributs des curseurs Curseur paramétré

DECLARE
%NOTFOUND est égal à FALSE si FETCH renvoie un résultat. CURSOR c(s number) IS SELECT ename, sal FROM emp WHERE sal >= s;
nuplet c%ROWTYPE;

%FOUND est égal à TRUE si FETCH renvoie un résultat. BEGIN


OPEN c(2500);
FETCH c INTO nuplet;
WHILE c%FOUND LOOP
%ROWCOUNT renvoie le nombre de n-uplets lus. DBMS_OUTPUT.PUT_LINE(nuplet.ename || ' : ' || nuplet.sal);
FETCH c INTO nuplet;
END LOOP;
%ISOPEN est égal à TRUE si le curseur est ouvert. CLOSE c;
END;
Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 151 Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 152

151 152

38
23/08/2019

Exceptions Exceptions systèmes


Libellé erreur Code erreur SQLCODE
---------------------------------------------------------------------------------------
Quand une erreur survient, une exception est levée (exécutée). CURSOR_ALREADY_OPEN ORA-06511 -6511
Gestion des erreurs dans des routines séparées du programme principal DUP_VAL_ON_INDEX ORA-00001 -1
INVALID_CURSOR ORA-01001 -1001
Avantages INVALID_NUMBER ORA-01722 -1722
– Gestion systématique des erreurs LOGIN_DENIED ORA-01017 -1017
NO_DATA_FOUND ORA-01403 -1403
– Gestion groupée des erreurs similaires
NOT_LOGGED_ON ORA-01012 -1012
– Lisibilité du code PROGRAM_ERROR ORA-06501 -6501
STORAGE_ERROR ORA-06500 -6500
Fonctions PL/SQL de gestion des erreurs TIMEOUT_ON_RESOURCE ORA-00051 -51
– SQLCODE : Code de la dernière exception levée TOO_MANY_ROWS ORA-01422 -1422
– SQLERRM : Message d’erreur associé VALUE_ERROR ORA-06502 -6502
ZERO_DIVIDE ORA-01476 -1476
Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 153 Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 154

153 154

Exceptions personnalisées Exemple d’exception


DECLARE
Déclaration (section DECLARE) c INTEGER;
nom_exception EXCEPTION; personne EXCEPTION;
BEGIN
Lever l’exception (section BEGIN) SELECT COUNT(*) INTO c FROM emp;
IF c = 0 THEN
IF condition THEN
RAISE personne;
RAISE nom_exception; END IF;
END IF; EXCEPTION
WHEN personne THEN
Gérer l’exception (section EXCEPTION) RAISE_APPLICATION_ERROR(-20501, 'Table vide !');
WHEN nom_exception THEN -- Instruction(s) PL/SQL ; END; -- Code d’erreur compris entre –20999 et -20001
Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 155 Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 156

155 156

39
23/08/2019

Gestion d’exceptions imprévues Procédures stockées


DECLARE
i INTEGER := &saisie; Définition : Procédures précompilées stockées de manière
e1 EXCEPTION; permanente dans la base de données
e2 EXCEPTION;
BEGIN Création
IF i = 1 THEN CREATE PROCEDURE nom_proc (paramètres) AS ...
RAISE e1;
ex. CREATE PROCEDURE HelloWorld AS
ELSIF i = 2 THEN BEGIN
RAISE e2; DBMS_OUTPUT.PUT_LINE('Hello World!');
ELSE END;
i := i / 0;
END IF; Exécution sous SQL Developer en PL/SQL
EXCEPTION ex. EXECUTE HelloWorld HelloWorld;
WHEN e1 THEN RAISE_APPLICATION_ERROR(-20001, 'Exception 1');
WHEN e2 THEN RAISE_APPLICATION_ERROR(-20002, 'Exception 2'); Suppression
WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20999, SQLERRM); ex. DROP PROCEDURE HelloWorld;
END;
Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 157 Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 158

157 158

Paquetages Définition d’un paquetage


-- Définition de la spécification
Définition : Ensemble de types, curseurs, variables et CREATE [OR REPLACE] PACKAGE nom_paquetage AS
sous-programmes interreliés et stockés ensemble [-- Définition de types publics]
[-- Déclaration de curseurs publics]
Un paquetage est subdivisé en deux parties : [-- Déclaration de variables globales publiques (à éviter !)]
[-- Déclaration de sous-programmes publics]
– Spécification : interface (déclarations publiques), END;
– Corps : déclarations privées et code. -- Définition du corps (optionnelle)
CREATE [OR REPLACE] PACKAGE BODY nom_paquetage AS
[-- Définition de types privés]
Oracle 8 documentation
[-- Spécification de curseurs publics et privés]
(Fig. 8-1)
[-- Déclaration de variables globales privées (à éviter !)]
[-- Spécification de sous-programmes publics et privés]
END;
Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 159 Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 160

159 160

40
23/08/2019

Exemple de spécification de paquetage Exemple de corps de paquetage


CREATE OR REPLACE PACKAGE Employes AS CREATE OR REPLACE PACKAGE BODY Employes AS
TYPE nuplet IS RECORD (ename emp.ename%TYPE, CURSOR salaire_dec RETURN nuplet IS
SELECT empno, sal FROM emp ORDER BY sal DESC;
salary emp.sal%TYPE);
PROCEDURE embaucher (numemp NUMBER,
CURSOR salaire_dec RETURN nuplet; nom VARCHAR, job VARCHAR,
PROCEDURE embaucher ( mgr NUMBER, sal NUMBER,
numemp NUMBER, comm NUMBER, numdep NUMBER) IS
nom VARCHAR, BEGIN
job VARCHAR, INSERT INTO emp VALUES (numemp, nom, job,
mgr NUMBER, mgr, SYSDATE, sal, comm, numdep);
sal NUMBER, END;
PROCEDURE licencier (emp_id NUMBER) IS
comm NUMBER,
BEGIN
numdep NUMBER); DELETE FROM emp WHERE empno = emp_id;
PROCEDURE licencier (emp_id NUMBER); END;
END; END;
Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 161 Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 162

161 162

Déclencheurs Principaux types de déclencheurs

Définition : Procédure stockée associée à une table et


Insertion Deletion Update
exécutée automatiquement lorsque des événements liés
à des actions sur la table surviennent (mises à jour,
principalement).
Before 1 2 3
Les déclencheurs complètent des contraintes d’intégrité
en permettant de créer des règles d’intégrité complexes.
Ce sont des éléments des bases de données actives. After 4 5 6

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

163 164

41
23/08/2019

Définition de déclencheur Variables spécifiques aux déclencheurs

:NEW.nom_attribut : Valeur d’un attribut après mise à jour


CREATE [OR REPLACE] TRIGGER nom_declencheur
ex. INSERT INTO client (1, 'NouveauClient');
BEFORE | AFTER
INSERT | DELETE | UPDATE :NEW.NumCli prend la valeur 1 dans le déclencheur.
| [INSERT] [[OR] DELETE] [[OR] UPDATE] :NEW.Nom prend la valeur 'NouveauClient' dans le déclencheur.

ON nom_table
[FOR EACH ROW] :OLD.nom_attribut : Valeur d’un attribut avant mise à jour
-- Bloc PL/SQL codant les actions à effectuer ex. DELETE FROM client WHERE NumCli = 33;
:OLD.NumCli prend la valeur 33 dans le déclencheur.
Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 165 Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 166

165 166

Exemple de déclencheur (1/2) Exemple de déclencheur (2/2)


-- Emulation de clé primaire sur la table client -- La clé existe-t-elle déjà ?
SELECT COUNT(NumCli) INTO n FROM client
CREATE OR REPLACE TRIGGER client_pk WHERE NumCli = :NEW.NumCli;
BEFORE INSERT OR UPDATE ON client IF n > 0 THEN
FOR EACH ROW RAISE cle_existante;
DECLARE END IF;
n INTEGER; EXCEPTION
cle_existante EXCEPTION; WHEN cle_existante THEN
cle_nulle EXCEPTION; RAISE_APPLICATION_ERROR(-20501,
BEGIN 'Clé primaire déjà utilisée !');
-- La clé est-elle vide ? WHEN cle_nulle THEN
IF :NEW.NumCli IS NULL THEN RAISE_APPLICATION_ERROR(-20502,
RAISE cle_nulle; 'Une clé primaire doit avoir une valeur !');
END IF; END;
Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 167 Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 168

167 168

42
23/08/2019

SQL statique vs. SQL dynamique Requête dynamiques

Exemples Exécution : EXECUTE IMMEDIATE requete -- requete est une chaîne


[INTO res1, res2…];
– Procédure stockée qui met la table EMP à jour
 SQL statique (la requête est connue à la compilation)
Note :
– Procédure stockée qui met à jour une table dont le nom est un paramètre – Requêtes paramétrées : valeurs de la base de données (statiques).
 SQL dynamique (la requête complète n’est pas connue à la – Si l’on veut paramétrer des objets (tables, vues, attributs...) : requête
compilation) dynamique.

Définition du SQL dynamique : NB : Les requêtes qui altèrent la structure de la base de données
Construction d’une requête SQL à la volée dans un bloc PL/SQL (CREATE, DROP, ALTER…), même statiques, doivent être exécutées
en mode dynamique.
Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 169 Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 170

169 170

Exemples de requêtes dynamiques Curseurs dynamiques


DECLARE -- Exemple
DECLARE TYPE CursDyn IS REF CURSOR; -- Pointeur vers un curseur
requete VARCHAR(250); emp_cv CursDyn; -- Curseur dynamique
nom_table CHAR(4) := 'dept'; nom emp.ename%TYPE;
numdep dept.deptno%TYPE := 50; salaire emp.sal%TYPE := 10000;
n INTEGER; BEGIN
BEGIN OPEN emp_cv FOR -- Le curseur est forcément explicite
-- Construction de requête par concatenation 'SELECT ename, sal FROM emp
requete := 'DELETE FROM '||nom_table||' WHERE deptno = '||numdep; WHERE sal > ' || salaire;
EXECUTE IMMEDIATE requete; FETCH emp_cv INTO nom, salaire;
-- Récupération d'un résultat de requête dynamique WHILE emp_cv%FOUND LOOP
requete := 'SELECT COUNT(*) FROM ' || nom_table; -- Instructions PL/SQL
EXECUTE IMMEDIATE requete INTO n; FETCH emp_cv INTO nom, salaire;
END; END LOOP;
CLOSE emp_cv;
END;
Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 171 Bases de données avancées http://eric.univ-lyon2.fr/jdarmont/ 172

171 172

43
23/08/2019

Конец

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

173

44

Vous aimerez peut-être aussi