SlideShare une entreprise Scribd logo
1
Filière (DUT) : Génie Informatique (S3)
Année Universitaire : 2018/2019 au 2023/2024
Diaporamas du cours :
Bases de données avancées
Préparé par : Idriss CHANA
Enseignant chercheur au Département Génie Informatique, EST-UMI
Meknès Email : i.chana@umi.ac.ma
Au Profit des Etudiants de La Deuxième Année de la filière GI inscrits en
semestre S3
Bases de données Avancées
• Vous permettre d’ exploiter les fonctionnalités avancées d’un SGBDR. (vue,
séquences, indexe, Synonymes, gestion des utilisateurs et leurs droits ….)
• Vous permettre de maitriser l’outil PLSQL Manipulation et
• Vous rendre capable de Programmer des procédures stockées et des
déclencheurs (Triggers).en utilisant un SGBDR Oracle .
• Vous permettre de vous initier au concept de Big Data et aux base de
donnes NoSql
2
Objectif du module
 Chap 1 : Introduction Générale :
1- Introduction sur les Base de données et SGBDR
2- Les fonctionnalités d’un SGBDR
 Chap 2 : Rappel Langage SQL : Mode interactif Langage (LDD) et (LMD)
 Chap 3 : Langage SQL avancé :
1. Les ordre SQL complexe ( agrégat , requête imbriquées, et la clause having)
2. La Création des Vues et des Index, les synonymes et Les Séquences
3. La Gestion de transactions
 Chap 4 : Langage SQL en mode procédural (PL/SQL):
1. PL/SQL Déclaration des variables, ,Curseurs, et gestion des exceptions
2. Procédures et fonctions stockées
3. Les Déclencheurs (Triggers)
 Chap 5 : Gestion et Administration des droits des Utilisateur Oracle
1. Dictionnaire de données , Gestion des utilisateurs
2. Privilèges et Rôle . Profil d'utilisateur .
3. Sécurité d’une base de données
 Chap 6 : Base de Donnes NO SQL ( Mongo DB)
1. Introduction au Bid Data
2. Type de bases de données Nosql.
3. Base de données NoSQL Orientée Documents « MongoDB »
Plan de module
4
-Cours et TD
-Travaux Pratiques
Modalité d’apprentissage
Technicien Spécialisé et BDA
5
Évaluation
• Cours & TD 50%
- DS théorique
- Participation pendant des séances de TDs et de cours
• TP 50%
- DS Pratique
- Participation active pendant des séances de TPs .
- Rapport rendu à la fin des séances des TPs
6
Chap I: Introduction aux bases de données et SGBD
Information :C’est un élément de connaissance concernant des faits,
des sujets ou des élément particulier
Donnée: est une information quelconque, aussi c’est une relation
entre des information
Exemples :
1-Brahim est une personne
2- Brahim étudie les base de données
Définitions
7
• Persistance de données
Entrée (données)+traitement Résultat durable .
• Quantité très importante de données à gérer et à manipuler
• Cohérence de données (intégrité ,identifiant..)
• Non redondance de données
Chap I: Introduction aux bases de données et SGBD
8
Organisation logique et physiques des donnés, indépendance des traitements
Les Besoins :
Historiquement l’information a vu trois approches
 Approche Système de Gestion fichiers(SGF).
 Approche Base de données gérées par les SGBD et SGBDR
 Actuellement avec les Big data Sandbox ( données structurées et
non structurées)
Approches Gestions de l’information
Chap I: Introduction aux bases de données et SGBD
9
Approche Système de Gestion de fichiers
Chap I :Introduction aux bases de données et SGBD
Utilisation d’un ensemble de fichiers de données
Définir les données en fonction des traitement (dépendance
données/programmes)
Toute application à ses propres programmes
Inconvénient :
Redondance (lorsque la volumétrie devient importante)
Lourdeur d’accès aux données (lorsque la volumétrie devient importante)
Difficulté des MAJ
Risque de perdre l’intégrité des données
1
Les données de la BD sont décrites hors des programmes
Approche Base de données.
Chap I :Introduction aux bases de données et SGBD
Avantages :
Pas de Redondance
Vitesse d’accès au donnée
Facilité des MAJ
Respect de l’intégrité des données
11
Chap I :Introduction aux bases de données et SGBD
Que doit permettre un SGBDR ?
1-Décrire les données
indépendamment des applications (de manière intrinsèque)
Langage de Définition de Données (LDD)
2-Manipuler les données
Interroger et mettre à jour les données sans préciser d'algorithme d'accès
dire QUOI sans dire COMMENT
langage de requêtes déclaratif ex.:
quels sont les noms des produits de prix < 100DH ?
Langage de Manipulation de Données (LMD)
12
3-Contrôler les données
Intégrité ; vérification de contraintes d'intégrité
ex.: la note doit être comprise entre 0 et 20
Chap I :Introduction aux bases de données et SGBD
Que doit permettre un SGBD suite… ?
Question1 :Si la secrétaire a saisi par erreur la
note d’une matière (51/20 au lieu 15/20) qui ce qui se
passe et comment remédier à cette situation ??????
Confidentialité : contrôle des droits d'accès, autorisation
Question2 :est ce que un étudiant peut changer la
note qu’ il a eu dans une matière donnée et comment géré
ça ??????
Pour ces deux situation le SGBD doit permettre un :
Langage de Contrôle de Données (CLD)
13
4-Partage
Une BD est partagée entre plusieurs utilisateurs en même temps.
Il en déroule donc : Un contrôle des accès concurrents.
- notion de transaction
L'exécution d'une transaction doit préserver la cohérence de la BD
Que doit permettre un SGBD suite… ?
Chap I :Introduction aux bases de données et SGBD
Question3 :Si je suis à Meknès et j’ai un compte
bancaire initialement ouvert à une agence bancaire
située sur Rabat comment est ce que je peux
consulté mon compte ??????
14
-Reprise après panne, journalisation
- Contrôle d’accès
index (hashage, arbres balancés ...)
5-Sécurité
6-Performances d'accès
Que doit permettre un SGBD suite… ?
Chap I:Introduction aux bases de données et SGBD
15
7-Indépendance physique
Pouvoir modifier les structures de stockage ou les index sans que cela ait de
répercussion au niveau des applications
Les disques, les méthodes d’accès, les modes de placement,
le codage des données ne sont pas apparents
Permettre aux différentes applications d’avoir des vues différentes des
mêmes données
Permettre au administrateur de la base de modifier le schéma logique
sans que cela ait de répercussion au niveau des applications
8-Indépendance logique
Que doit permettre un SGBD suite… ?
Chap I :Introduction aux bases de données et SGBD
16
Structure de SGDB
Chap I Introduction aux bases de données et SGBD
17
Le concept de vue permet d'obtenir l'indépendance logique
La modification du schéma logique n’entraîne pas la modification des applications
(une modification des vues est cependant nécessaire)
Chaque vue correspond à la perception d’une partie des données,
mais aussi des données qui peuvent être synthétisées à partir des
informations représentées dans la BD (par ex. statistiques)
Le niveau Logique( conceptuel tables vues ect …. )
il contient la description des données et des contraintes d’intégrité
(Dictionnaire de Données) le schéma logique découle d’une activité de modélisation
Le niveau externe
Le niveau interne ou dit physique
il correspond aux structures de stockage et aux moyens d’accés
Chap I: Introduction aux bases de données et SGBD
Structure de SGDB Suite …
18
Chap I: Introduction aux bases de données et SGBD
19
Résumé:
Les fonctions des SGBD
1-DEFINITION DES DONNEES
Langage de définition des données (DDL)
(conforme à un modèle de données)
2-MANIPULATION DES DONNEES
Interrogation
Mise à jour(insertion, suppression, modification)
Langage de manipulation des données (DML)
(langage de requête déclaratif)
3-CONTRÔLE DES DONNEES
Contraintes d'intégrité
Contrôle des droits d'accès
Gestion de transactions
Langage de contrôle des données (DCL)
Chap I :Introduction aux bases de données et SGBD
20
Système de Gestion de Base de Données (SGBD) (DBMS en anglais ):
programme qui permet la définition, la mise en œuvre, et l’exploitation
d’une BD (à un niveau plus abstrait que celui fournit par les OS usuels
(gestion de fichiers de droits etc. …)).
1)
Base de données (BD)(DB en anglais ) :
ensemble cohérent, intégre, partagé de données structurées défini pour les
besoins d’une application
Chap I: Introduction aux bases de données et SGBD
21
Questions
1) Donnez une définition aux :
-Base de données
-SGBD ?
2) Quel est le cycle de vie d’une base de données ?
2) Voir le slide précèdent
22
Maître d’oeuvrage
Partie porteuse du besoin qui définit l’objet du projet, le calendrier et le
budget
Maître d’oeuvre
Partie en charge de la réalisation technique du projet
Acteurs de développement
Chapitre 2: SQL : LDD, LMD et
contraintes
Rappel Langage SQL-LDD et LMD :
 Langages (LDD)
 Langages (LMD)
 Les contrainte d’intégrité CIF et CIR
 Exercices d’application
SQL ne se résume pas aux requêtes d'interrogation d'une base.
Ce langage permet aussi de :
- créer des tables
- de modifier la structure de tables existantes
- de modifier le contenu des tables
Le LDD est le Langage de Définition de Données (DDL en anglais).
Il permet de:
 créer des tables par l'instruction CREATE TABLE et de:
 Modifier la STRUCTURE (et non le contenu) des TABLES avec
ALTER TABLE
 Supprimer une table avec DROP TABLE.
Le LMD est le langage de manipulation de données. Parfois on inclut le
LID (langage d'interrogation de données) dans cette partie. Il permet de
modifier le CONTENU d'une table en
 Ajoutant de nouvelles lignes INSERT INTO nom_table
 Modifiant une ou plusieurs lignes UPDATE nom_table SET
 Supprimant des lignes DELETE FROM nom_table
Chapitre 2: SQL : LDD, LMD et
contraintes
Langage de Définition de Données ( LDD)
• Syntaxe simple :
CREATE TABLE nom_table
(
nom_col_1 type_col_1,
nom_col_2 type_col_2,
…
nom_col_n type_col_n
);
Création d'une table : CREATE TABLE
Les principaux types autorisés sont :
Char(n) Chaîne de caractè. de long fixe = n
Varchar2(n)/ Varchar(n) Chaîne de caractè. longueur
variable
Varchar )  2000 Octet (standart ANSI)
Varchar2  4000 Octet ( Oracle)
Number Entier ou réel
 Number (p) Entier (d’au plus p chiffres)
Number(p,d) Décimal sur p positions en tout
(séparateur décimal compris), dont d chiffres décimaux
Date le format dépend de la configuration d'Oracle. Le
plus souvent c'est jj/mm/aaaa
Long Chaîne longue ; restriction : par table, pas plus
d’une colonne de type long
Exemple1 : CREATE TABLE employe
(
empno number(8) not null,
nom varchar2(20),
Fonction varchar2(10),
Sal number(8,2),
code_service char(3),
date_embauche date ) ;
Les autres propriétés possibles ( quelques Contraintes d’intégrité
fonctionnelles
NOT NULL : Indique qu'on est obligé de mettre une valeur dans la colonne
UNIQUE : Indique que les valeurs dans la colonne doivent être toutes différentes
(comme pour les clés, sauf que ce n'est pas une clé)
DEFAULT : Permet d'indiquer une valeur par défaut à la création d'une nouvelle
ligne Exemple 2 CREATE TABLE compte
(
num_cpte NUMBER(11) NOT NULL,
type_cpt VARCHAR2(8) DEFAULT ‘chèque’,
solde NUMBER(10, 2) DEFAULT 0 );
Ajouter /Supprimer une ou plusieurs colonne
ALTER TABLE nom_table ADD (nom_colonne1 type_colonne1, nom_colonne2
type_colonne, …. );
ALTER TABLE nom_table drop(nom_colonne1 , nom_colonne2, …);
Exemple:
ALTER TABLE service ADD (budget number(6), sous_traitant varchar2(30) ) ;
ALTER TABLE Album DROP (RUNK) ;
La modification d'une table : ALTER TABLE
 Modifier le type ou tout autre propriété d'une colonne
ALTER table nom_table Rename COLUMN nom_colonne to New nom_colonne
ALTER TABLE nom_table MODIFY (nom_colonne
nouveau_type_et/ou_nouvelle_propriété);
Exemples:
1) ALTER TABLE employe MODIFY (sal number(10,2), fonction
varchar2(30) ) ;
Renommer et supprimer une table
 Supprimer une table
DROP TABLE nom_table;
 Exemple : DROP table employe ;
 Renommer une table:
• RENAME TABLE nom_table TO nouveau_nom_table;
 Exemple : RENAME TABLE employe to salarie ;
Le LDD Avancée
 Les contraintes d'intégrité
Une contrainte d'intégrité est une règle qui permet d'assurer la validité (cohérence) des
données stockées dans une base.
Le SGBD contrôle les contraintes d'intégrité à chaque modification dans les tables
(saisies, modification ou suppression).
Les différentes contraintes que l'on peut définir sont :
 non nullité (obligation) : NOT NULL : La colonne ne peut pas contenir de valeurs
NULL.
 unicité : UNIQUE Toutes les valeurs de la (des) colonnes doivent être différentes ou
NULL
 clé primaire : PRIMARY KEY : primary key = unique + not null
valeur par défaut : DEFAULT Permet de spécifier une valeur par défaut à la colonne
(dans le cas où aucune valeur n'est explicitement donnée)
 intégrité de domaine : CHECK Permet de spécifier les valeurs acceptables pour une
colonne.
intégrité référentielle (clé étrangère) : FOREIGN KEY Cette colonne fait référence à
Attention, on ne met pas de virgule entre la définition de la colonne et celle de
la contrainte.
 Les contraintes d'intégrité
• Cette contrainte permet de rendre obligatoire la saisie d'une colonne.
 Exemple :
CREATE TABLE PERSONNE
(
NomPers Varchar2(30) NOT NULL,
PrénomPers Varchar2(30)
);
D’après cette contrainte on aura :
• INSERT INTO PERSONNE VALUES ('Dupont', 'Jean'); autorisé
• INSERT INTO PERSONNE VALUES ('Martin', NULL); autorisé
• INSERT INTO PERSONNE VALUES (NULL, 'toto'); refusé
• INSERT INTO PERSONNE(PrénomPers) VALUES ('titi'); refusé
Question :
• INSERT INTO PERSONNE(NomPers) VALUES (‘Harish'); refusé/ autorisé
?
1- Contrainte d'obligation : NOT NULL
car il faut obligatoirement que le nom ait une valeur.
 Les contraintes d'intégrité
Sur une seule colonne
CREATE TABLE PERSONNE
(…
Téléphone CHAR(10) UNIQUE
);
Sur plusieurs colonnes :
CREATE TABLE PERSONNE
( NomPers Varchar2(30) NOT NULL,
PrénomPers Varchar2(30),
UNIQUE (NomPers, PrénomPers)
);
Une telle contrainte indique qu'on ne pourra pas avoir deux
personnes ayant le même nom et le même prénom.
2 Contrainte d'unicité : UNIQUE
Cette contrainte permet de contrôler que chaque ligne a une valeur
unique pour la colonne ou l'ensemble de colonne unique (pas de
doublons)
CREATE TABLE PERSONN
(NomPers Varchar2(30) PRIMARY
KEY,
PrénomPers Varchar2(30) PRIMARY
KEY,
…);
CREATE TABLE PERSONNE
(NomPers Varchar2(30),
PrénomPers Varchar2(30),
PRIMARY KEY (NomPers, PrénomPe rs)
);
 Les contraintes d'intégrité
3-Contrainte de clé primaire:
La contrainte de clé primaire permet d'indiquer que la ou les colonnes
sont uniques et ne peuvent pas avoir de valeur nulle.
1er cas : Si la table possède une clé composée d'une seule colonne, alors il
est possible de l'indiquer juste après la colonne clé.
CREATE TABLE PERSONNE
( idPers number(20) PRIMARY KEY,
noms varchar(10)
… );
2em cas :
Si la table a une clé compose de plusieurs colonnes, alors il est impossible
d'indiquer  PRIMARY KEY au niveau des colonnes.
Ainsi, si on insère la personne toto de la manière suivante :
INSERT INTO PERSONNE (idPers, NomPers) VALUES
(100, 'toto');
Alors les valeurs de ses champs seront :
 Les contraintes d'intégrité
4-Contrainte Valeur par défaut : DEFAULT
CREATE TABLE PERSONNE
(idPers PRIMARY KEY,
NomPers Varchar2(30) NOT NULL,
PrénomPers Varchar2(30) DEFAULT 'prénom
inconnu',
DateNaiss Date DEFAULT CURRENT DATE);
100, 'toto', 'prénom inconnu', ‘02/10/2023'
 Syntaxe : après le mot clé CHECK, on indique entre
parenthèses le critère à vérifier.
5-Contrainte de domaine : CHECK
La définition des types de données pour chaque colonne définit déjà un domaine
pour les valeurs. On peut encore restreindre les domaines grâce à la clause
CHECK.
Attention  cette contrainte est très "coûteuse" en terme du temps, car elle est
basé sur une comparaison pouvant contenir une requête de type SELECT. Pour
valider la contrainte, le prédicat doit être évalué à TRUE ou UNKNOWN (présence
de NULL
 Les contraintes d'intégrité
 Exemple: CREATE TABLE personne ( idpers Number PRIMARY KEY,
NomPers Varchar2(30) NOT NULL,
PrenomPers Varchar2(30) DEFAULT 'prénom inconnu',
age Number CHECK (age >= 0 AND age < 18),
etat_civil Varchar2(20) CHECK (etat_civil IN ('marié(e)', célibataire',
'veuf(ve)', 'divorcé(e)') );
 Les contraintes d'intégrité
Il est possible de donner un nom à chaque contrainte (sinon le système en donne un par défaut).
Il suffit de faire précéder la contrainte par le mot-clé CONSTRAINT suivi de son nom.
6 Exemple récapitulatif
CREATE TABLE PERSONNE
(
idpers Number CONSTRAINT clé_primaire PRIMARY KEY,
nom Varchar2(30) CONSTRAINT nom_existant NOT NULL,
prenom Varchar2(30) CONSTRAINT prénom_par_défaut DEFAULT
'prénom inconnu',
age Number CONSTRAINT verify_age CHECK (age >= 0 AND age
< 130),
etat_civil Varchar2(20) CONSTRAINT domaine_état_civil
CHECK (etat_civil IN ('marié(e)', célibataire', 'veuf(ve)', 'divorcé(e)')
);
 Les contraintes d'intégrité
5- Intégrité référentielle :
5-1 : REFERENCES
L'intégrité référentielle permet de vérifier la cohérence des liens entre tables, lors de
l'ajout, de la suppression et de la modification de lignes. Elle est utilisée lorsqu'on a
une clé étrangère. Elle permet d'assurer que toute valeur de clé étrangère
correspond bien à une valeur de clé primaire de la table liée. Voyons tout d'abord la
syntaxe avec un exemple:
Soit le modèle relationnel suivant :
CLIENT (id_client, Nom_client, …)
FACTURE (code_fact, #id_client, …)
Voilà comment on le traduit en SQL : CREATE TABLE FACTURE
(
code_fact Number PRIMARY KEY,
id_client Number REFERENCES
CLIENT(id_client)
…
);
CREATE TABLE CLIENT
(
id_client Number PRIMARY
KEY,
Nom_client Varchar2(30) NOT
NULL,
…
5- Intégrité référentielle :
5-2 Intégrité référentielle : Conséquences
L'application de l'intégrité référentielle implique plusieurs choses :
 On ne peut pas ajouter une facture avec un id_client qui n'existe pas dans la
table client (sinon un message d'erreur apparaît). Il faut d'abord créer le
client avant de créer sa facture.
 On ne peut pas supprimer un client s'il existe des factures qui lui
correspondent. Il faut d'abord supprimer toutes les factures qui le concernent
avant de pouvoir le supprimer
 On ne peut pas modifier l'id_client dans la table client s'il existe des factures
qui le concernent.
 On peut modifier l'id_client de facture seulement si on choisit un id_client
qui existe dans la table client.
Cela revient à vérifier que toutes les factures correspondent toujours à un client
qui existe
5- Intégrité référentielle :
5-2 Options
Options des contraintes d'intégrité référentielles Effacer en cascade
ON DELETE CASCADES.
Si on ajoute cette option à la contrainte d'intégrité référentielle, alors si on
supprime une ligne de client, toutes les factures de ce client seront
supprimées.
Attention :
cette contrainte s'applique à la table facture ('enfant') mais elle est vérifiée
lorsqu'on modifie la table client ('parent')
CREATE TABLE FACTURE
(
code_fact Number PRIMARY KEY,
id_client Number REFERENCES CLIENT(id_client) ON DELETE
CASCADE
…
);
5- Intégrité référentielle :
5-3 Références à des colonnes multiples
CREATE TABLE RESERVATION ( id_resa Number PRIMARYKEY,
id_hotel Number,
num_ch Number,
date Date NOT NULL,
FOREIGN KEY (id_hotel, num_ch)
REFERENCES CHAMBRE (id_hotel,
num_ch) );
Il arrive qu'une clé primaire, composée de plusieurs colonnes, soit elle-même
clé étrangère d'une autre table.
On indique alors cette clé étrangère composée après la définition des colonnes,
grâce au mot clé FOREIGN KEY suivi des colonnes clés étrangères, puis de
REFERENCES, le nom de la table référencée ainsi que le nom des colonnes
référencées entre parenthèses.
Exemple : soit le schéma relationnel suivant
CHAMBRE(id_hotel, num_ch, tarif)
RESERVATION(id_resa, #id_hotel, #num_ch, date)
CREATE TABLE LIGNE_COMMANDE
(
id_commande Number REFERENCES COMMANDE(id_commande),
ref_produit Varchar2(10) REFERENCES PRODUIT(ref_prod),
quantité Number DEFAULT 1,
PRIMARY KEY (id_commande, ref_produit)
);
5- Intégrité référentielle :
5-4 La clé primaire est composée de plusieurs clés étrangères
Remarque :
dans la table PRODUIT, la référence est codée par ref_prod
et dans la table COMMANDE, c'est ref_produit
 Ajout/ modification ou suppression d'une
contrainte
Exemple 2 : On ajoute la contrainte de vérification de l'âge d'une personne:
Sql> ALTER TABLE PERSONNE ADD CONSTAINT verif_age CHECK
(age <= 130);
Exemple1 : On ajoute la contrainte d'intégrité référentielle dans la table
COMMANDE.
Sql> ALTER TABLE COMMANDE ADD CONSTAINT FK_idclient FOREIGN KEY
(id_client) REFERENCES CLIENT(id_client);
Syntaxe générale :
ALTER TABLE nom_table ADD CONSTRAINT Nom_Constraint
TYPE_CONTRAINTE (colonne(s));
ALTER TABLE nom_table DROP CONSTRAINT <Nom_constaint>;
Pour ajouter/supprimer ou modifier une contrainte à une table existante,
il suffit d'utiliser la commande:
 ALTER TABLE
Exemple 3 : Supprimer la contrainte de vérification de l'âge d'une personne:
Sql> ALTER TABLE PERSONNE Drop CONSTAINT verif_age);
alter table nom_table modify (col default ‘Val_par_defau);
 ALTER TABLE cas particulier : la proprité « par defautlt » n’est
pas une contraite oracle :
Exercices d’application(TD/TP 1)
Soit le schéma logique suivant
1- Créer les tables en respectant le type de donnée de chaque attribut. La
création va se faire comme suite:
- 1er Créer la table STYLES en déclarant la Clés primaire en même temps
-2ém Créer la table ARTIST en déclarant la Clés primaire en même
temps
-3ém Créer la table ALBUM sans mentionner les clés
-4ém Créer la table STYLE sans mentionner les clés
2- En utilisant les contraintes, déclarer les clés primaires et étrangères
pour les deux tables : ALBUM et STYLE
P= clé primaire
F= Clé étrangère
FP= les deux
clés
3- Ajouter une colonne Role de type quelconque à la table STYLE
4- Ajouter une contrainte à la colonne PRICE de la table ALBUM ( PRICE> 30)
5. Affecter la valeur 0 à tous les RANK de tous les ALBUM existants
6. Modifier la colonne RANK de la table Album pour qu'elle prenne la valeur 0 par
défaut
7- Supprimer la colonne Role de la table STYLE
8. Ajouter:
- un nouveau STYLES
- un nouveau ARTIST
- un nouveau ALBUM
- un nouveau STYLE
9. Donner les albums dont le prix est inférieur à 9 euros.
10. Donner les albums qui sont sortis après le 18 mai 1999.
11. Donner les artistes dont l’album a atteint un rank supérieur ou égal à 25000.
8. Changer le rang de l’artiste « BOB » à 30
Exercices d’application
(Suite)
CREATE TABLE ALBUM
(
ASIN INT (38) NOT NULL ,
TITLE VARCHAR (30) NOT NULL ,
IDARTIST INT (38) NOT NULL ,
PRICE number(10) ,
`RELEASE` DATE,
RANK number (28) ,
IDLABEL number (38) NOT NULL
);
CREATE TABLE ARTIST
(
ID Number (38) NOT NULL ,
NOM VARCHAR (30) NOT NULL
);
ALTER TABLE ALBUM ADD CONSTRAINT PK_ALBUM PRIMARY KEY (ASIN);
ALTER TABLE ALBUM ADD CONSTRAINT FK_ALBUM_ARTIST Foreign Key
(IDARTIST) REFERENCES ARTIST (ID);
ALTER TABLE ALBUM ADD CONSTRAINT FK_ALBUM_LABEL Foreign Key
(IDLABEL) REFERENCES LABEL (ID);
ALTER TABLE ARTIST ADD CONSTRAINT PK_ARTIST PRIMARY
KEY (ID);
Exercices d’application (Creation des tables))
ALTER TABLE STYLE ADD CONSTRAINT PK_STYLE PRIMARY KEY (ASIN);
ALTER TABLE STYLE ADD CONSTRAINT FK_STYLE_ALBUM
Foreign Key (ASIN)REFERENCES ALBUM (ASIN);
ALTER TABLE STYLE ADD CONSTRAINT FK_STYLE_STYLES
Foreign Key (STYLE) REFERENCES STYLES (STYLE);
CREATE TABLE STYLES
(
STYLE VARCHAR (24) NOT NULL
);
ALTER TABLE STYLES ADD CONSTRAINT PK_STYLES
PRIMARY KEY (STYLE);
CREATE TABLE STYLE
(
ASIN INT (38) NOT NULL ,
STYLE VARCHAR (24) NOT
NULL
);
Exercices d’application (Création des tables suite …)
• Requêtes imbriquées
• Agrégat
• Regroupement
• La gestion des Vues et des Index, des synonymes et des Séquences
• La Gestion de transactions
Chapitre 3 : Requêtes Complexes
Motivation
• Les requêtes déjà vues ne correspondent qu’à des opérations
simples
• Vers le PL/SQL
• Requête imbriquée
 Parfois la valeur d’un test doit être calculé comme le résultat d’une autre
requête
• Agrégat
 Opération destinée à agréger plusieurs valeurs de tuples en une seule
valeur (en les additionnant, en calculant leur moyenne, etc.)
• Regroupement
 Décomposition d’une table en plusieurs sous-tables sur lesquels des
opérations seront effectuées sous-table par sous-table (des agrégats par
exemple)
Requêtes imbriquées
48
SQL : Requêtes imbriquées
• Requête imbriquée dans la clause WHERE d'une requête externe:
• Opérations ensemblistes
 Le résultat d’une requête (imbriquée) est une table, c’est-à-dire un
ensemble de tuples.
 Les opérations possibles sont donc ensemblistes.
SELECT …
FROM …
WHERE [Expression] Opérateur (SELECT
…
FROM …
WHERE …);
Requête
imbriquée
Requête
externe
4
Opérateurs
ensemblistes
• IN
 appartenance ensembliste
 (A1,…An) IN <sous-req>
• EXISTS
 test d’existence
 EXISTS <sous-req>
• COMPARAISON
 comparaison avec chaque élément d’un ensemble
 (A1,…An) ALL <sous-req>
 opérateur
5
de comparaison (<,>,<=,>=,<>)
Expression IN
5
• Sémantique :
 la condition est vraie si tuple désigné par (A1,…,
appartient au résultat de la requête interne.
• Algorithme
An)de la requête externe
 Pour chaque tuple des tables de la requête externe, extraire et calculez le
sous-tuple (A1,…An)
 Si le tuple obtenu appartient au résultat de la requête imbriquée,
calculezet ou afficher les expressions de projection de la clause
SELECT.
SELECT …
FROM …
WHERE (A1,…,An)IN (SELECT B1,…,Bn
FROM …
WHERE …);
Expression NOT IN
5
• Sémantique :
 la condition est vraie si tuple désigné par (A1,…, An)de la requête externe
n’appartient pas au résultat de la requête interne.
• Algorithme
 Pour chaque tuple des tables de la requête externe, extraire et calculez le
sous-tuple (A1,…An)
 Si le tuple obtenu n’appartient pas au résultat de la requête
imbriquée, calculer et/ou afficher les expressions de projection
de la clause SELECT.
SELECT …
FROM …
WHERE (A1,…,An)NOT IN (SELECT B1,…,Bn
FROM …
WHERE …);
Exemple avec IN
53
• Noms des employés qui travaillent
dans des villes où il y a des projets
de budget inférieur à 50?
SELECT Ename
FROM
WHERE
Emp
City IN
(SELECT City
FROM Project
WHERE Budget < 50);
Emp (Eno, Ename, Title, City)
Pay(Title, Salary)
Project(Pno, Pname, Budget, City)
Works(Eno, Pno, Resp, Dur)
• Noms des employés qui travaillent
dans des villes où il n’y a pas de
projets de budget inférieur à 50?
SELECT Ename
FROM Emp
WHERE City NOT IN
(SELECT City
FROM Project
WHERE Budget
< 50);
ALL
• est une comparaison :
• Sémantique
{<, <=, >, >=, <>}
 ALL ( ) : la condition est alors vraie si la comparaison est vraie pour
tous les tuples résultats de la requête interne.
• Algorithme
 Pour chaque tuple des tables de la requête externe, extraire et calculez le
sous-tuple (A1,…An)
 Si la comparaison de (A1,..,An) est vraie avec tous les tuples de
la requête imbriquée, alors calculer et/ou aficher les
expressions de projection de la clause SELECT.
SELECT …
FROM …
WHERE (A1,…,An) ALL (SELECT B1,…,Bn
FROM …
WHERE …);
54
Exemple avec ALL
• Noms des projets qui ont le plus gros budget ?
SELECT DISTINCT Pname
FROM Project
WHERE Budget >= ALL (SELECT Budget
FROM Project)
Emp (Eno, Ename, Title, City)
Pay(Title, Salary)
Project(Pno, Pname, Budget, City)
Works(Eno, Pno, Resp, Dur)
5
ANY
• est une comparaison :
• Sémantique
{<, <=, >, >=, <>}
 ANY: la condition est alors vraie si la comparaison est vraie avec au
moins un tuple résultats de la requête interne.
• Algorithme
 Pour chaque tuple des tables de la requête externe, extraire et calculez le
sous-tuple (A1,…An)
 Si la comparaison de (A1,..,An) est vraie avec au moins un tuple
de la requête imbriquée, alors calculer et/ou afficher les
expressions de projection de la clause SELECT.
SELECT …
FROM …
WHERE (A1,…,An) ANY (SELECT B1,…,Bn
FROM …
WHERE …);
56
Exemple avec ANY
5
• Noms des villes qui ont au moins un projet de budget supérieur à
50000 ?
SELECT DISTINCT City
FROM Project
WHERE Budget = ANY
(SELECT Budget
FROM Project
WHERE Budget > 50000)
Emp (Eno, Ename, Title, City)
Pay(Title, Salary)
Project(Pno, Pname, Budget, City)
Works(Eno, Pno, Resp, Dur)
EXISTS
• EXISTS retourne VRAI ou FAUX
• Sémantique :
– La condition EXISTS est vraie si la requête imbriquée n’est pas vide.
• Algorithme
 Pour chaque tuple des tables de la requête externe, extraire et
calculez le sous-tuple (A1,…An)
 Si le résultat de la requête imbriquée n’est pas vide, alors
calculer et/ou aficher les expressions de projection de la clause
SELECT.
SELECT …
FROM R1 ,X, …
WHERE EXISTS (SELECT B1,…,Bn
FROM …
WHERE Condition(x) …);
Les deux requêtes
5
sont généralement
corrélées, la
requête imbriquée
dépend de la
valeur de x.
Exemple avec EXISTS
• Noms des employés qui travaillent dans une ville où il y a au
moins un projet?
SELECT
FROM
WHERE
e.Ename Emp
e
EXISTS (SELECT
FROM
*
Project
WHERE e.City=Project.City)
• Noms des projets qui emploient des ‘Elect Eng’ ?
Emp (Eno, Ename, Title, City)
Pay(Title, Salary)
Project(Pno, Pname, Budget, City)
Works(Eno, Pno, Resp, Dur)
5
SELECT
FROM
WHERE
p.Pname
Project p
EXISTS(SELECT *
FROM Works w, Emp e
WHERE w.Pno=p.Pno and e.Eno=w.Eno
and e.Title=’Elect.Eng.’)
Exemple avec EXISTS
La requête imbriquée ne dépend pas de p : elle retourne
l’ensemble des employés de titre ‘Elect. Eng.’,
indépendamment du projet sélectionné dans la requête externe.
La clause EXISTS retourne donc toujours vraie (on suppose
qu’il existe un tel employé) et la requête externe retourne tous
les noms de projets.
Emp (Eno, Ename, Title, City)
Pay(Title, Salary)
Project(Pno, Pname, Budget, City)
Works(Eno, Pno, Resp, Dur)
6
SELECT p.Pname
FROM Project p
WHERE EXISTS
(SELECT * FROM Works w, Emp e
WHERE e.Eno=w.Eno
Ande.Title=’Elect.Eng.’)
NOT EXISTS
• NOT EXISTS retourne VRAI ou FAUX
• Sémantique :
– La condition NOT EXISTS est vraie si la requête imbriquée est vide.
• Algorithme
• Pour chaque tuple des tables de la requête externe, extraire et
calculez le sous-tuple (A1,…An)
• Si le résultat de la requête imbriquée est vide, alors calculer et/ou
aficher les expressions de projection de la clause SELECT.
SELECT …
FROM R1 x…
WHERE NOT EXISTS (SELECT B1,…,Bn
FROM …
WHERE Condition(x));
Les deux requêtes
6
sont généralement
corrélées, la
requête imbriquée
dépend de la
valeur de x.
Exemple avec NOT EXISTS
6
• Noms des projets qui n’emploient aucun ‘Elect Eng’ ?
SELECT
FROM
WHERE
p.Pname
Project p
NOT EXISTS (SELECT *
FROM Works w, Emp e
WHERE w.Pno=p.Pno
and e.Eno=w.Eno
and e.Title=’Elect.Eng.’);
Emp (Eno, Ename, Title, City)
Pay(Title, Salary)
Project(Pno, Pname, Budget, City)
Works(Eno, Pno, Resp, Dur)
Agrégat
63
Fonctions d'agrégation
• Une fonction d’agrégation permet de calculer une seule valeur
numérique à partir des valeurs de plusieurs tuples pour un attribut
donné
 Exemple: la somme des budgets des projets
• Une fonction d’agrégation prend un attribut en paramètre
• On utilise une fonction d’agrégation
 dans la clause SELECT pour effectuer un calcul post-projection
 dans la clause WHERE pour remplacer une valeur par un calcul dans une
condition. Ce calcul est le résultat de l’agrégation d’une requête imbriquée.
SELECT
FROM
WHERE
6
AggFunc(Ai), …, AggFunc(Aj)
R1, ..., Rm
conditions;
Fonctions d’agrégation
6
Fonction Description
COUNT([DISTINCT]x,y,…) Décompte des tuples du résultat par
projection sur le ou les attributs
spécifiés (ou tous avec ‘*’).
L’option DISTINCT élimine les
doublons.
MIN(x), MAX(x), AVG(x),
SUM(x)
Calculent respectivement le
minimum, le maximum, la
moyenne et la somme des valeurs
de l’attribut X.
Exécution d’une requête d’agrégation
6
1. La requête est exécutée classiquement et retourne une table
résultat temporaire dont les colonnes sont les attributs Ai, …, Aj
utilisées dans les fonctions d’agrégation
2. Les fonctions d’agrégation sont appliquées sur les colonnes de la
table résultat
3. Le résultat de la requête est une table
 dont les colonnes sont les noms des expressions de la clause
SELECT
 contenant un seul tuple
Requête d’agrégation
Personnes
SELECT sum(salaire)
FROM Personnes
Sum(salaire)
9700
Etape 1)
Table-Temp =
SELECT salaire
FROM Personnes
T
able-T
emp
Etape 2)
Table-Resultat =
SELECT sum(salaire)
FROM Table-Temp
agrégation
T
able-Resultat
67
nom prénom salaire
Martin Pierre 2500
Dupond Jean 3000
Dupond Marc 4200
salaire
2500
3000
4200
Exemples d'agrégation
dans la clause SELECT
6
• Budget max des projets de Paris?
SELECT
FROM
WHERE
MAX(Budget)
Project
City = ’Paris’;
• Affichage du nombre d’employés
SELECT COUNT(*) FROM Emp;
Emp (Eno, Ename, Title, City) Project(Pno, Pname, Budget, City)
Pay(Title, Salary) Works(Eno, Pno, Resp, Dur)
• Nombre de villes où il y a un projet avec
l'employé E4?
SELECT
FROM
WHERE
AND
COUNT(DISTINCT City)
Project, Works
Project.Pno = Works.Pno
Works.Eno = ’E4’;
Exemple d'agrégation
dans la clause WHERE
6
Emp (Eno, Ename, Title, City) Project(Pno, Pname, Budget, City)
Pay(Title, Salary) Works(Eno, Pno, Resp, Dur)
• Noms des projets dont le budget est supérieur au budget
moyen?
SELECT Pname
FROM Project
WHERE Budget > (SELECT AVG(Budget)
FROM Project);
Exemples d'agrégation
• Budget max des projets de Paris avec identifiant ?
SELECT Pno, MAX(Budget)
FROM Project
WHERE City = ’Paris’;
• Budget max des projets de Paris avec identifiant ?
Emp (Eno, Ename, Title, City)
Pay(Title, Salary)
Project(Pno, Pname, Budget, City)
Works(Eno, Pno, Resp, Dur)
Impossible de mélanger une
fonction d’agrégation avec un
attribut sans agrégation s’il n’y a
pas de clause GROUP BY !
7
SELECT Pno, Budget
FROM Project
WHERE City = ’Paris’
AND Budget = (SELECT MAX(Budget) FROM
Project and
City=‘Paris’);
Regroupement
71
Requêtes de groupement :
GROUP BY
• Sémantique
 Partitionne les tuples résultats en fonction des valeurs de certains attributs
• Algorithme
1. Calcul de la requête brute (sans regroupement ni agrégation)
2. Regroupement horizontal des lignes en sous-tables possédant les mêmes
valeurs de regroupement Aj …, Ak
3. Pour chaque sous-table, calcul des valeurs agrégées pour les attributs non
regroupés
SELECT
FROM
WHERE
GROUP
7
A1, …, An,
R1, …, Rm
…
BY A1 …, An
AggFunc(An+1), …, AggFunc(An+p)
GROUP BY
SELECT A1, B1, sum(A2)
FROM R1, R2
WHERE A1 < 3
GROUP BY A1, B1
R1
7
R2
B1
a
group by
where select
A1A2
2 6
1 1
2 8
3 3
1 2
3 3
A1 A2 B1
2 6 a
1 1 a
2 8 a
1 2 a
A1 A2 B1
2 6 a
1 1 a
2 8 a
3 3 a
1 2 a
3 3 a
A1 B1 sum(A2)
1 a 3
2 a 14
A1 B1 A2*
1 a 1
2
2 a 6
8
from
GROUP BY
7
• Règles de regroupement
 Tous les attributs Ai, …, An dans la clause SELECT qui ne sont pas
impliqués dans la clause GROUP BY doivent être inclus dans une
opération d'agrégation
• SELECT Pno, count(Eno) FROM Works
GROUP BY Pno;
• Sélection des tuples
 La clause WHERE permet de sélectionner les tuples appartenant aux sous-
tables. La condition est évaluée AVANT le regroupement.
• SELECT Pno, count(Eno) FROM Works
WHERE Dur >10
GROUP BY Pno;
Exemples de groupement
• Numéros des projets avec le nombre d’employés impliqués par
projet ?
SELECT Pno, Count(Eno)
FROM Works
GROUP BY Pno;
• Noms des villes avec la durée moyenne et la durée maximale de
participation de tout les employé par ville et par nom de
projet ?
Emp (Eno, Ename, Title, City)
Pay(Title, Salary)
Project(Pno, Pname, Budget, City)
Works(Eno, Pno, Resp, Dur)
7
SELECT
FROM
WHERE
Pname, AVG(Dur), MAX(Dur)
Works, Project
Works.Pno=Project.Pno
GROUP BY City, Pname;
Exemple de groupement ordonné
Classement des produits par la valeur totale vendue pour les
produits
SELECT DISTINCT produit.nom, SUM(vente.qt *
AS total
FROM produit, vente
produit.prix)
WHERE
GROUP
ORDER
produit.id = vente.produit_idx
BY produit.nom
BY total;
Le tri des résultats se fait
APRES le regroupement
et l’agrégation.
7
Sélection sur des groupes
GROUP BY Aj …, Ak
HAVING condition
• Sémantique
 Sélectionne les groupes (partitions) qui satisfont une certaine condition .
• Algorithme
1. Sélectionne tous les tuples qui satisfont les conditions de la clause WHERE.
2. Forme les groupes qui partagent les mêmes valeurs de la clause GROUP BY.
3. Supprime tous les groupes qui ne satisfont pas les conditions de la clause
HAVING
4. Applique les fonctions d’agrégation pour chaque groupe.
5. Retourne les valeurs des colonnes et des agrégation de la clause SELECT.
7
SELECT
FROM
WHERE
Ai, …, An,
R1, …, Rm
…
[AggFunc(Ai), …, AggFunc(Aj), …]
Sélection sur des groupes
7
• Règle : La condition de la clause HAVING porte
 Soit sur des valeurs atomiques retournées par un opérateur d'agrégation sur
les attributs qui n’apparaissent pas dans le GROUP BY
 Soit sur des opérations d’agrégation sur des attributs qui apparaissent dans
le GROUP BY
• Exemple
SELECT DISTINCT produit.nom,
SUM(vente.qt*produit.prix) AS "total produit",
vente, produit
produit.id = vente.produit_idx
and nom like’a%’
BY produit.nom
FROM
WHERE
GROUP
HAVING MIN(vente.qt)>1;
Exemples de groupement avec sélection
7
• Villes dans lesquelles habitent plus de 2 employés?
SELECT City FROM Emp GROUP BY City
HAVING COUNT(ENO) > 2;
• Projets dans lesquels 2 employés ou plus partagent une
responsabilité?
Emp (Eno, Ename, Title, City)
Pay(Title, Salary)
Project(Pno, Pname, Budget, City)
Works(Eno, Pno, Resp, Dur)
SELECT DISTINCT Pno
FROM Works where resp=‘Oui’
GROUP BY Pno, Resp
HAVING COUNT(DISTINCT ENO) >=2;
Exemples de groupement avec sélection
8
SELECT DISTINCT model FROM voiture
SELECT DISTINCT produit.nom, SUM(vente.qt * produit.prix) AS total
FROM produit, vente WHERE produit.id=vente.produit_idx
And produit.nom like ’M%’
GROUP BY produit.nom , produit_idx
ORDER BY total;
Classement des produits par la valeur totale vendue pour les produits commençant par
la lettre ‘M’.
Produit( id, nom, prix,…)
vente( id_vente, produit_idx*, qt, …,…)
Afficher Les modèles de voitures qui proposent un choix de plus de 10 couleurs.
Voiture ( id_voiture, model, couleur,…)
GROUP BY model
HAVING COUNT(couleur) > 10;
Est-ce Correcte ?!
8
 Langage SQL avancé :
1- Les ordre SQL complexe ( agrégat , requête
imbriquées, et la clause having)
2- Les Vues et Index,
3- Les Séquences et Les synonymes
4- La Gestion de transactions
Chapitre 3(Suite)
Les Vues
(VIEW)
8
 une vue est une table virtuelle résultat d’une requête
 Rôle d’une vue
 Réduire la complexité syntaxique des requêtes
 Améliorer les performances de certains traitements
 Définir les schémas externes.
 Définir des contraintes d’intégrité.
 Définir un niveau additionnel de sécurité en restreignant l’accès à un sous ensemble
de lignes et/ ou de colonnes.
Les vues font partie du Schéma externe, schéma visible par les applications utilisant la
base de données.
83
La requête SQL peut s'appliquer à une table ou une vue (exception faite
de la vue que l'on est en train de définir, i.e. on ne peut pas créer une
définition récursive). La définition de la vue est stockée dans le
dictionnaire ce qui permet de traduire toute requête utilisant des vues en
une requête sur les tables.
Une vue permet de donner un nom à une requête.
La syntaxe SQL de création d'une vue est simplement
create [or replace] view nom_vue as
requete_sql [option]
• On crée les vues suivantes Nom_Emp et som_sal
1- Nom_Emp: Create view Nom_Emp as select * from EMPLOYEES
where last_name like ‘ J%’
2- som_sal : create or replace view SOM_SAL as select J.job_title J_titl,
sum(E.SALARY) somme_sal from employees E,jobs J where E.job_id=J.job_id
group by job_title
• Soit les tables suivante de Schéma HR de oracle
EMPLOYEES(EMPLOYEE_ID , FIRST_NAME , LAST_NAME ,EMAIL,PHONE_NUMBER
,HIRE_DATE ,JOB_ID,SALARY, COMMISSION_PCT, MANAGER_ID,DEPARTMENT_ID)
JOBS(JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY)
• Modification au travers d'une vue
Les instructions de mise à jour de la vue doivent être traduites en mise à jour sur les
tables de base. Ceci n'est pas possible dans le cas général. Pour cette MAJ Il faut que
:
1- Chaque colonne de la vue doit correspondre à une colonne d'une table.
2- La vue ne doit pas contenir :
un opérateur ensembliste
un opérateur DISTINCT
une fonction de groupe, ou une fonction mathématique
une clause GROUP BY, ORDER BY
des jointures (avec quelques exceptions ( notion de clé préservée dans la vue) )
On peut interdire de modifier une vue, avec l'option WITH READ ONLY. (Sous Oracle,
mais je n'ai pas vu cette option dans la norme SQL).
8
8
La clause WITH CHECK OPTION
Cette option (définie dans la norme SQL) permet de vérifier que lorsqu'on modifie
une vue, les lignes concernées par la modification sont bien sélectionnées par la
requête qui définit la vue.
Sans cette option, voici le genre de problèmes que l'on peut avoir :
- Create view Nom_Emp as select * from EMPLOYEES where last_name like ‘ JOHN’
Vue bien crée
- insert into Nom_Emp
values(6666,'TATA','TINTIN','TINGBB','777','17/06/15','AD_PRES’,'24000',NULL,NUL
L,'90');
Ligne bien crée
Attention on se retrouve dan la vue avec des données non
souhaitées
-Update et delete aussi vont être bien exécutés sur la vue.
8
La clause WITH CHECK OPTION permet d'éviter les problèmes précédents
- Create view Nom_Emp as select *
from EMPLOYEES where last_name
like ‘ JOHN’ with check option
Vue bien crée
insert into Nom_Emp
values(6666,'TATA','TINTIN','TINGBB','777','1
7/06/15','AD_PRES’,'24000',NULL,NULL,'90');
ERREUR à la ligne 1: ORA-01402: vue
WITH CHECK OPTION - violation de
clause WHERE
Pour renommer une vue : Rename ancien_nom to
nouveau_nom;
Rappels sur les indexes : Principes choix et
création : index btree , BitMap
L’index est utile pour accélérer l’exécution d’une requête SQL qui lit des données et ainsi
améliorer les performances d’une application utilisant une base de données
Les 2 types d’index les plus utilisé dans Oracle :
Arbres équilibrés (B-arbre) : toutes les branches de l’arbre ont la même longueur
Il est efficace lorsque les données indexés ne sont pas répétés ( Clé primaire , données uniques)
 Bitmap : Si peu de valeurs sont possibles pour les données répétées, une chaine de bits pour
chaque valeur
Un index est un objet complémentaire (mais non indispensable) à la base de données permettant d'"indexer"
certaines colonnes dans le but d'améliorer l'accès aux données par le SGBDR, au même titre qu'un index
dans un livre ne vous est pas indispensable mais vous permet souvent d'économiser du temps lorsque vous
recherchez une partie spécifique
Qu'est-ce qu'un index?
De manière générale, un index est créé automatiquement lors de la création de la
clé primaire d'une table ;
de la même manière, il est d'usage d‘en créer un pour chaque clé étrangère afin
d'améliorer la vitesse lors des jointures.
Un index peut être :
 Simplement le stockage des données d'une colonne de table qui sera souvent
sollicitée (surtout au niveau des recherches)
 L'ensemble de plusieurs colonnes qui feront l'objet de requête pour les
recherches.
Création de l’index
• Quand créer un index
-----------------------------
 Attributs utilisées dans des jointures,
 Attributs servant souvent pour les sélections,
 Table de gros volume dont la majorité des
interrogations sélectionne moins de 15% des
lignes,
• Quand ne pas créer un index
-------------------------------
 Attributs souvent modifiés (index à
recréer...),
 Table de petit volume,
 si requêtes sur NULL car les NULL, non
stockés dans l’index. (ex : WHERE ... IS
NULL).
Bitmap : attribut à peu de valeurs distinctes,
B-arbre : attribut à beaucoup de valeurs
Création de l’index
La création d'index en SQL se fait grâce à la clause INDEX précédée
de la clause CREATE. Elle permet de définir un index désigné par son nom, portant
sur certains champs d'une table.
La syntaxe est la suivante :
CREATE [UNIQUE] [BITMAP]INDEX Nom_de_l_index ON Nom_de_la_table
(Nom_de_champ [ASCDESC], ...)
[Tablespace nom_tablespace_des_index] ;
•L'option UNIQUE permet de définir la présence ou non de doublons pour les
valeurs de la colonne
•L'option BITMAP Index de type bitmap
•Les options ASCDESC permettent de définir un ordre de classement des valeurs présentes
dans la colonne
•Supprimer l’INDEX  DROP INDEX Nom_Index
0-100
-----------
--
101-200
-----------
-------
………
….
-----------
------
301-
400-
Branches
( Branch
Blocks)
0-33
-----------
34-67
----------
68-100
101-134
-----------
135-167
----------
167-300
0 Rowid
-----------
1 Rowid
----------
…
-------
33 Rowid
34
Rowid
-----------
35
Rowid
----------
…
-------
67
Rowid
68 Rowid
-----------
69 Rowid
----------
…
-------
100Rowi
d
101
Rowid
-----------
102Rowid
----------
…
-------
134Rowid
135Rowi
d
-----------
136Rowi
d
----------
…
-------
167Rowi
d
168Rowi
d
-----------
169Rowi
d
----------
…
-------
300Rowi
d
Nœud racine
( Root Node)
Feuilles
( Leaf Blocks)
Le segment de la table
Table segment
22
-3
8
5
6
7
2
35
30
20
-5
25
12
10
6
22
-3
8
5
20
7
2
35
30
6
Les valeurs inférieures sont à gauche
Les valeurs Supérieures sont à droit
Comment ça marche L’index B-Tree ( L’arbre Binnaire)
Comment ça marche L’index B-Tree ( L’arbre
Binnaire)
La Recherche
20
10
8
6
5
Comment ça marche L’index B-Tree ( L’arbre
Binnaire)
L’Insertion
20
10
11
5 11
Comment ça marche L’index B-Tree ( L’arbre
Binnaire)
Suppression
20
10
5 7
8
6
7
Comment ça marche L’index B-Tree ( L’arbre
Binnaire)
Suppression
2
5
2
Comment ça marche L’index B-Tree ( L’arbre
Binnaire)
Suppression
20
20
30
25
22
22
L’index Bitmap Select nom, prenom, job_id from employees
ID NOM Prenom Job_id-
---------------------------------------------------------------------------
101 Neena Kochhar
AD_VP
102 Lex De Haan AD_VP
103 Alexander Hunold IT_PROG
104 Bruce Ernst IT_PROG
107 Diana Lorentz IT_PROG
108 Nancy Greenberg FI_MGR
109 Daniel Faviet FI_ACCOUNT
110 John Chen FI_ACCOUNT
111 Ismael Sciarra FI_ACCOUNT
112 Jose Manuel Urman FI_ACCOUNT
113 Luis Popp FI_ACCOUNT
115 Alexander Khoo PU_CLERK
116 Shelli Baida PU_CLERK
117 Sigal Tobias PU_CLERK
118 Guy Himuro PU_CLERK
119 Karen Colmenares PU_CLERK
120 Matthew Weiss ST_MAN
121 Adam Fripp ST_MAN
122 Payam Kaufling ST_MAN
123 Shanta Vollman ST_MAN
124 Kevin Mourgos ST_MAN
125 Julia Nayer ST_CLERK
126 Irene Mikkilineni ST_CLERK
127 James Landry ST_CLERK
128 Steven Markle ST_CLERK
105 David Austin IT_PROG
106 VallPataballa IT_PROG
1 2 3 4 5 6 7 8 …
ST_CLERK 0 0 0 0 0 0 0 0 .
.
ST_MAN 0 0 0 0 0 0 0 0 .
.
FI_ACCOU
NT
0 0 0 0 0 0 1 1 .
.
PU_CLERK 0 0 0 0 0 0 0 0 .
.
IT_PROG 0 0 1 1 1 0 0 0 .
.
AD_VP 1 1 0 0 0 0 0 0 .
.
Select * from employees where job_id like ‘FI_ACCOUNT’
L’index Bitmap n’est pas utilisé (exploité)
quand la clause est ( not like , not in , different
<>, null)
Exemple de création d’index
Créer l’index :
CREATE UNIQUE INDEX idx_clients ON clients(no_client)
CREATE BITMAP INDEX idx_empl ON departments (department_name)
Supprimer l’index  DROP index idx_empl
• Une séquence est un objet de base de données Oracle,
au même titre qu'une table, une vue,
• Elle appartient à un utilisateur, on peut donc si on a les
droits nécessaires :
 La manipuler,
 La modifier,
 La supprimer
 …..
Les Séquence
Définir une séquence équivaut à définir une
suite de nombres entiers.
L'évolution de cette suite est régie par un
certain nombre de paramètres,
L'utilisation d'une séquence permet donc
d'avoir à disposition une suite de valeurs.
Les Séquence
Définition d'une séquence
Création D’une Séquence
•  SQL> CREATE SEQUENCE ma_sequence;
• La séquence a 2 Pseudo-colones
• 1- La pseudo-colonne CURRVAL retourne la valeur courante de la séquence.
• 2- La pseudo-colonne NEXTVAL incrémente la séquence et retourne la nouvelle
valeur.
L'ordre SQL minimal de création d'une séquence :
SQL> select ma_sequence.nextval from dual;
NEXTVAL
1
SQL> select ma_sequence.currval from dual;
CURRVAL
---------
1
SQL> select ma_sequence.nextval from dual;
NEXTVAL
---------
2
Création D’une
Séquence
D’autre option de création d'une séquence :
Valeur initiale et incrément:
Les paramètres START WITH et INCREMENT BY.
RQ: ces paramètres peuvent s'utiliser indépendamment.
CREATE SEQUENCE ma_sequence START WITH 4 INCREMENT BY 2;
Dans cet exemple, on a défini la suite 4, 6, 8, 10,12, 14, 16,…., etc
Pour faire une suite descendante, il suffit d'indiquer une valeur négative au paramètre
CREATE SEQUENCE ma_sequence INCREMENT BY -10;
Valeur MAXI et MINI
CREATE SEQUENCE ma_sequence MAXVALUE MINVALUE;
CREATE SEQUENCE ma_sequence MINVALUE -20 MAXVALUE 40;
CREATE SEQUENCE ma_sequence START WITH 1 INCREMENT BY 1 MAXVALUE 9999;
CREATE SEQUENCE ma_sequence START WITH -1 INCREMENT BY -1 MINVALUE -9999;
• Lorsque la séquence atteint sa valeur maxi (resp. mini), on peut lui demander de s'arrêter
(Oracle retournera une erreur lors de la prochaine tentative d'utilisation de NEXTVAL), ou de
reprendre à sa valeur mini (resp. maxi) et reprendre son compte.
Cas N°1 :
• CREATE SEQUENCE ma_sequence_NC START WITH 1 MINVALUE -10 MAXVALUE 10
NOCYCLE;
Cette séquence comptera jusqu'à 10 puis retournera une erreur au NEXTVAL suivant
• Cas N°2 :
• CREATE SEQUENCE ma_sequence_WC START WITH 1 MINVALUE -10 MAXVALUE 10
CYCLE;
• Cette séquence (ma_sequence_WC ) comptera de 1 à 10, puis de -10 à 10, puis de -10 à
10... :
• Par défaut, une séquence ne reboucle pas (cas n°1)
Création D’une Séquence
Reboucler la séquence
•
SQL> create sequence seq_no_cli start with 1000 increment by 100;
• SQL> insert into clients (no, nom) values (seq_no_cli.nextval,'Martin');
Pour Supprimer une Séquence: DROP SEQUENCE
nom_de_la_sequence;
Pour Réinitialiser une séquence soit par Alter ou bien un Programme
PL/SQL
Création D’une Séquence
Exemple d’utilisation d’une la séquence
Les synonymes
• Un Synonyme: est un alias d’un objet base de données (tables, vues,indexes, synonymes,
séquences, déclencheurs, procédures, fonctions…)
•
• Si on crée le synonyme emp sur la tables hr.employee, alors manipuler emp, revient
• à manipuler hr.employee :
• SELECT * FROM employee équivaut à SELECT * FROM hr.employee
• Il existe deux types de synonymes :
• Synonyme privé : accessible uniquement à partir du schéma dans lequel il a été créé
• CREATE SYNONYM nom_syn FOR schema.nom_objet
• Synonyme public : accessible à partir de tout schéma
• CREATE PUBLIC SYNONYM nom_syn FOR schema.objet
Transactions
• Cohérence et Transaction :
• Un SGBD doit supporter :
• Plusieurs utilisateurs  utilisation en parallèle
•  Lecture et écriture Mise à jours
- Tout en garantissant la cohérence de la base de données
• Une transaction est une suite d’instructions qui réussissent ou qui échouent en
totalité (pas de réussite partielle).
• Ou encore c’est ensemble des ordre SQL indivisible faisant passer la base de
donnée d’un état cohérant à un autre en une seule étape
On dit qu’une transaction est ACID :
• Atomique, au sens où on ne peut pas la diviser en une partie qui échoue
et une partie qui réussit ;
• Cohérente, au sens où une fois la transaction terminée, la base est de
nouveau dans un état cohérent ;
• Isolée, au sens où une transaction considère que, pendant son exécution,
les données qu’elle manipule ne sont pas modifiées par une autre
transaction ;
• Durable, au sens où les modifications opérés par la transaction sont
enregistrées de façon permanente (et recouvrables en cas de
reconstruction de la base).
Transactions
• Opération commit , rollback
Transactions
Commit : Validation entière d’une transaction
Rollback : Annule entièrement une transaction
Savepoint : point de contrôle, état de la base où l’on pourra revenir plus tard
Rollback to savepoint nom_save_point
Exemple :
MAJ 1 ;
MAJ 2 ;
savepoint SV__A;
MAJ 3;
MAJ 4 ;
Si ( Condition est vraie)
Rollback to savepoint SV__A;
Fin si
commit
Si la condition est vraie le MAJ 3 et MAJ 4
seront annullées et les MAJ 1 et MAJ 2
seront validées
Si la condition est fausse le commit qui
vient après va valider les 4 mises à jour
• Exemples de
transactions
Insert into tabale_1 values ( ‘val1’, ’val2
‘….,’valn’);
Delete from Table_2 where champ1 like ‘toto’;
Commit;
Transaction
1
Insert into tabale_3 values ( ‘val1’, ’val2
‘….,’valn’);
Commit;
Transaction
2
Transactions
Exercice
Le pseudo code Numéro
Instruction
Questions
Insert into T1 values( ……) ;
Commit ;
Update T2 set col1 where …… ;
Delete from T1 where …… ;
Savepoint SV1 ;
Update T1 set colTT where …… ;
Delete from T2 where …… ;
Si (condition est vraie) alors
Update T1 set colTT where …… ;
Commit ;
Sinon rollback to Savepoint
SV1 ;
Fin Si
Delete from T2 where …… ;
1
2
3
4
5
6
7
Question 1) Quelles sont les
instructions qui sont validés si la
condition est vraie (
Réponse (écrire juste les numéros
des instructions) :
…………………………………………
…………………………………………
…………………………………………
……………………………………..
Question 2) Quel est le nombre des
transactions qui seront executées
dans ce programme Selon la
condition
Réponse :
- cas condition est vraie
……………………….
CHAPITRE 4 PL/SQL
 Langage SQL en mode procédural (PL/SQL):
1) Introduction et Blocs PL/SQL
2) PL/SQL Déclaration des variables , boucle, alternatives, affichage , GOTO
3) La gestion des exceptions
4) Curseurs
5) Procédures et fonctions stockées
6) Sous-blocs PL/SQL
7) Les Déclencheurs (Triggers)
Pourquoi PL/SQL ?
PL/SQL = PROCEDURAL LANGUAGE/SQL
 SQL est un langage non procédural
 Les traitements complexes sont parfois difficiles à écrire si on ne peut
utiliser des variables et les structures de programmation comme les
boucles et les alternatives
 On ressent vite le besoin d’un langage procédural pour lier plusieurs
requêtes SQL avec des variables et dans les structures de
programmation habituelles
▴
Langage PL/SQL
Principales caractéristiques
 Extension de SQL : des requêtes SQL cohabitent avec les structures de
contrôle habituelles de la programmation structurée (blocs, alternatives,
boucles).
 La syntaxe ressemble au langage Pascal.
 Un programme est constitué de procédures et de fonctions.
 Des variables permettent l’échange d’information entre les requêtes SQL
et le reste du programme
▴
Langage PL/SQL
 PL/SQL peut être utilisé pour l’écriture des procédures stockées et des
triggers.
(Oracle accepte aussi le langage Java)
 PL/SQL convient aussi pour écrire des fonctions utilisateurs qui peuvent être
utilisées dans les requêtes SQL (en plus des fonctions prédéfinies).
▴
Langage PL/SQL
Utilisation de PL/SQL
Utilisation de PL/SQL (suite)
 Le PL/SQL peut être utilisé sous 3 formes :
1
un bloc de code, exécuté comme une unique commande SQL, via un
interpréteur standard (SQLplus ou iSQL*PLus)
2
un fichier de commande PL/SQL
3
un programme stocké (procédure, fonction, trigger)
▴
Langage PL/SQL
Blocs
Un programme est structuré en blocs d’instructions de 3 types :
procédures ou bloc anonymes, SQL> start script.sql ou SQL>@ script.sql
procédures nommées,
fonctions nommées.
Un bloc peut contenir d’autres blocs.
Langage PL/SQL
Structure d’un bloc anonyme
DECLARE
−- d e f i n i t i o n d e s v a r i a b l e s
BEGIN
−− c o d e du programme
EXCEPTION
−− c o d e de g e s t i o n d es erreurs
END ;
Seuls BEGIN et END sont
obligatoires
Les blocs se terminent par un ;
Faisons ensemble un exemple sur SQL developer
Langage PL/SQL
-- Pour une fin de ligne
/* Pour
plusieurs
lignes */
Langage PL/SQL
Commentaires
Langage PL/SQL
Affichage : PROMPT , dbms_output.put_line
Lecture : ACCEPT en précédant par & la variable à lire
pour paramétrer la variable
Exemple : voir les exemples de slide suivant ( n oublier pas
celui du commentaire)
set serveroutput on;
declare
r number;
n1 number;
n2 number;
Begin
n1:=6;
n2 := 12;
r:=n2/n1;
dbms_output.put_line('rrr est egale à : '||r);
exception
when zero_divide then
dbms_output.put_line(‘impossible de diviser par 0’);
end ;
/
Exemple de base d’un bloc PL/SQL
Langage PL/SQL
Déclaration, initialisation des variables
 Identificateurs Oracle :
30 caractères au plus,
commence par une lettre,
peut contenir lettres, chiffres,_ $ et # pas sensible à la casse.
 Portée habituelle des langages à blocs
 Doivent être déclarées avant d’être utilisées
Langage PL/SQL
Déclaration et initialisation
Syntaxe : Nom_variable type_variable := valeur;
Initialisation
Nom_variable := valeur;
Déclarations multiples interdites.
Exemples
age integer;
nom varchar(30);
dateNaissance date;
 ok boolean := true;
▴
Langage PL/SQL
Plusieurs façons d’affecter une valeur à une variable
Opérateur d’affectation n:=
Directive INTO de la requête SELECT.
Exemples
dateNaissance := to_date(’10/10/2004’,’DD/MM/YYYY’);
Attention
Pour eviler les conflits de nommage, préfixer les variables PL/SQL par v_
V_sal:= 4000
Select departement_id into det_id from employees where id_employees =509;
SELECT nom INTO v_nom FROM employees WHERE id_employees =509;
Langage PL/SQL
SELECT ...INTO ...
Instruction :
SELECT expr1,expr2, ...INTO var1, var2, ...
Met des valeurs de la BD dans une ou plusieurs variables var1, var2, ...
Le SELECT ne doit retourner qu’une seule ligne
Avec Oracle il n’est pas possible d’inclure un SELECT sans INTO dans un programme
PL/SQL.
Pour retourner plusieurs lignes, voir la suite du cours sur les curseurs.
▴
Langage PL/SQL
Types de variables
VARCHAR2
Longueur maximale : 32767 octets ;
Exemples :
name VARCHAR2(30);
name VARCHAR2(30) := ’toto’ ;
NUMBER(long,dec)
Long : longueur maximale ;
Dec : longueur de la partie décimale ;
Exemples.
Num_tel number(10);
Salaire number(5,2):=142.12 ;
▴
Langage PL/SQL
DATE
Fonction TO DATE ;
Exemples :
Start_date := to_date(’29-SEP-2003’,’DD-MON-YYYY’);
La vraible sttart date est evaluée et analysée par oracle par 2 chiffre pour le jour, trois
letters pour le mois et l’année sur 4 chirffrer separées par un tiret (-)
start_date := to _date(’29-SEP-2003:13:01’,’DD-MON-YYYY:HH24:MI’) ;
Ici La vraible start_date est evaluée et analysée par oracle par 2 chiffre pour le jour,
trois letters pour le mois et l’année sur 4 chirffrer separées par un tiret (-). Avec aussi
l’heurs et les minutes
BOOLEAN
TRUE
FALSE
NULL
▴
Types de variables (suite)
Langage PL/SQL
Déclaration %TYPE et %ROWTYPE
V_nom emp.nom%TYPE
On peut déclarer qu’une variable est du même type qu’une colonne
d’une table (ou de meme type qu’ autre variable).
V_employe emp%ROWTYPE;
Une variable peut contenir toutes les colonnes d’un tuple d’une table
(la variable v_employe contiendra une ligne de la table emp).
Important pour la robustesse du code
▴
Langage PL/SQL
DECLARE
v_employe EMPLOYEES%ROWTYPE;
v_nom EMPLOYEES.FIRST_NAME%TYPE;
BEGIN
SELECT * INTO v_employe FROM EMPLOYEES
WHERE employee_id=100 ;
v_nom :=v_employe.FIRST_NAME;
v_employe.department_id:=20;
v_employe.employee_id:=7777;
v_employe.EMAIL:='changyah';
INSERT into employees VALUES v_employe;
dbms_output.put_line ('ttt '|| v_employe.employee_id);
END;
Vérifier à bien retourner un seul tuple
avec la reqête SELECT ...INTO ...
▴
Déclaration %TYPE et %ROWTYPE
-Exemple
Langage PL/SQL
Exercice :
a- Créer un bloc PL/SQL pour insérer un nouveau département dans la table
DEPARTEMENTS (DEPT_ID, DEPT_NAME, LOCATION_ID)
- Utiliser la séquence DEPT_ID_SEQ pour générer un numéro de département
(DEPT_ID).
- Créer un paramètre pour lire le nom du département du clavier.
- Laisser le numéro de LOCATION_ID à NULL.
- Afficher le numéro de département qu’on vient d’inserer
b- enregistrer le code dans le fichier scipt1.sql , donner la commande d’exécution
de scipt1.sql .
Solution
set serveroutput ON
ACCEPT p_dept_nom PROMPT ‘Entrer un nom de département : ‘
Declare
Numd number;
BEGIN
INSERT INTO departments VALUES (dept_id_seq.NEXTVAL, '&p_dept_nom', NULL,null);
COMMIT;
Select dept_id_seq.CURRVAL into Numd from dual;
dbms_output.put_line ('num depart inseré est '|| Numd);
END;
/
Execution ( le code est enregistré dans le fichier script1.sql
SQL> start script1.sql
Ou
SQL> @ script1.sql
Exercice 2
Créer un bloc PL/SQL pour supprimer le département créé
précédemment en
-Créant r un paramètre pour le numéro de département à supprimer
,
-A ffichant le nombre de département avant et après la suppression
1
Langage PL/SQL : Commandes
Les alternatives (if , else, elesif, case )
Les boucles (loop, while , for )
Affichage dbms_output.put_line ()
et retour chariot chr(10)
La commande GOTO
Test conditionnel
IF-THEN
IF v_date > ’01−JAN−08’ THEN
V_salaire := V_salaire *1.15;
END I F ;
IF-THEN-ELSE
IF v_date > ’01−JAN−08’ THEN
V_salaire := v_salaire ∗ 1.15;
ELSE
V_salaire := v_salaire ∗ 1.05;
END I F ;
▴
Langage PL/SQL : Commandes
IF-THEN-ELSIF
IF v_nom =’PARKER’ THEN
V_salaire:= V_salaire * 1.15;
ELSIF v_nom =’ SMITH ’ THEN
V_salaire:= V_salaire *1.05
END I F ;
▴
Langage PL/SQL : Commandes
Test conditionnel(2)
CASE
CASE selection
WHEN expression1 THEN resultat1 ou instruction 1
WHEN expression2 THEN resultat2 ou instruction 2
ELSE autre resultat ou autre instruction
END ;
CASE renvoie une valeur qui
vaut resultat1 ou resultat2 ou . . . ou
resultat par défaut
.
Exemple de Case Dans une requette SQL
▴
Langage PL/SQL : Commandes
SELECT last_name, first_name ,job_id,
CASE
WHEN job_id='AD_PRES' THEN 'C est le président'
WHEN job_id='AD_VP ' THEN ' Vice Président chargé de la Administration'
WHEN job_id='FI_MGR' THEN ' Administrateur Financier'
WHEN job_id='FI_ACCOUNT' THEN ' Comptable'
WHEN job_id='AC_ACCOUNT' THEN ' Trésorier'
ELSE 'Autre fonction'
END
FROM employees;
Declare
LN$Num integer := 0 ;
Begin
LN$Num := '&entre' ;
CASE LN$Num
WHEN 1 Then dbms_output.put_line( ' premier' ) ;
WHEN 2 Then dbms_output.put_line( 'deuxieme' ) ;
WHEN 3 Then dbms_output.put_line( 'troisiem' ) ;
ELSE dbms_output.put_line( 'rang supérieur' ) ;
END CASE ;
End ;
/
CASE : Exemple dans un bloc PL/SQL
Langage PL/SQL : Commandes
Case Simple
DECLARE
v_prix_vente NUMBER(9,2);
v_Value NUMBER(9,2) := &v_prix_vente;
v_taux_Commission NUMBER(3,2);
BEGIN
CASE
WHEN v_Value <= 100 THEN v_taux_Commission := 0.03;
WHEN v_Value <= 250 THEN v_taux_Commission := 0.05;
WHEN v_Value <= 1000 THEN v_taux_Commission := 0.08;
ELSE v_taux_Commission := 0.10;
END CASE;
DBMS_OUTPUT.PUT_LINE('Montant de la Commission est : '
|| TO_CHAR(v_taux_Commission * v_Value) || 'Dirhames');
END;
CASE : Exemple dans un bloc PL/SQL
Langage PL/SQL : Commandes
Pour le CASE l'omission de la clause ELSE provoque une erreur
s’il rencontre un cas non traité
Case de recherche
LOOP
instructions ;
EXIT [WHEN condition ] ;
instructions ;
END LOOP ;
WHILE condition LOOP
instructions ;
END LOOP ;
Exemple
LOOP
Monthly_value := daily_value*31
EXIT WHEN monthly_value > 4000;
END LOOP ;
Obligation d’utiliser la commande EXIT
pour éviter une boucle infinie.
▴
Langage PL/SQL : Commandes
Les boucles : LOOP
Exemple : Insérer 10 articles avec la date d’aujourd’hui.
declare
. . .
V_Date DATE;
V_compteur NUMBER( 2 ) := 1 ;
BEGIN
. . .
V_Date := SYSDATE;
LOOP
INSERT INTO article ( Artno , ADate )
VALUES ( v_compteur , v_Date ) ;
V_compteur := V_compteur + 1 ;
EXIT WHEN V_compteur > 1 0;
END LOOP;
. . .
END;/
Langage PL/SQL : Commandes
Les boucles : LOOP
FOR indice IN [ REVERSE ] debut . . fin
LOOP
instructions ;
END LOOP ;
Le mot clef REVERSE
à l’effet escompté.
Exemple
FOR ii IN REVERSE 1..15
LOOP
jj:=ii*31;
END LOOP
▴
Ne pas déclarer indice,
il est déclaré implicitement.
Langage PL/SQL : Commandes
Les boucles : FOR
- La boucle FOR du PL/SQL s'incrémente (ou se décrémente)
forcément de 1 en 1.
- On pourra également utiliser un curseur dans la clause IN
- Vous pouvez cependant simuler un pas supérieur, comme le montre
cet extrait de la doc :
DECLARE
step INTEGER := 2;
BEGIN FOR i IN 1..5
LOOP DBMS_OUTPUT.PUT_LINE (i*step);
END LOOP;
END;
Exemple
Langage PL/SQL : Commandes
GOTO
GOTO <libelé>;
PL/SQL contient aussi la commade GOTO qui permet de
faire le branchement d’un programme d’un point un autre
point durant son execution, ça syntaxe est :
DECLARE
v_compteur NUMBER(2) := 1;
BEGIN
LOOP
v_compteur := v_compteur + 1;
IF v_compteur > 5 THEN
GOTO stop_processing;
END IF;
DBMS_OUTPUT.PUT_LINE('v_compteur est : '
|| v_compteur);
END LOOP;
<<stop_processing>>
DBMS_OUTPUT.PUT_LINE(' la valeur finale de
v_compteur final est ' || v_compteur );
END;
Langage PL/SQL : Commandes
GOTO
Activer le retour écran : set serveroutput on size 10000
Sortie standard : dbms_output.put_line (chaıne);
Concaténation de chaînes : opérateur ||
Exemple
DECLARE
i number (2);
BEGIN
FOR i IN 1 .. 5 LOOP
dbms_output.put_line('Nombre: ‘|| i );
END LOOP;
END ;
/
’
Le caractère / seul sur une ligne déclenche l’évaluation.
▴
Si on veut un retour chariot
on place le caractére suivant:
chr(10)
Langage PL/SQL : Commandes
Affichage
Exemple bis
DECLARE
compteur number(3);
BEGIN
SELECT COUNT( ∗ ) INTO compteur
FROM Etudiant ;
FOR i IN 1.. compteur LOOP
dbms_output.put_line(‘Nombre : ‘|| i);
END LOOP ;
END ;
Langage PL/SQL : Commandes
Affichage
Gestion des Erreurs
 Section Exception
 Anomalie programmeur
 Erreur Oracle
Section Exception
 Notion d’exception: traitements d’erreurs
 Types d’erreurs:
 Erreurs internes Oracle (Sqlcode <> 0)
 Erreurs programme utilisateur
 Règles à respecter
 Définir et donner un nom à chaque erreur
 Associer ce nom à la section Exception (partie declare)
 Définir le traitement dans la partie Exception
Gestion des Exceptions
EXCEPTION
WHEN nom_exception1 THEN
instructions_PL_SQL;
…
WHEN nom_exceptionN Then
instructions PL/SQL;
…
[WHEN OTHERS THEN
instrctions_PL/SQL;]
END;
Sortie du bloc après exécution du traitement
Syntaxe
DECLARE
.....
nom_erreur EXCEPTION;
BEGIN
.....
IF anomalie THEN RAISE nom_erreur ;
.....
EXCEPTION
WHEN nom_erreur THEN traitement;
END;
Gestion des Exceptions
Syntaxe : en cas de déclaration définition
Gestion d’une erreur : exemple
DECLARE
sal_nul EXCEPTION;
sal employees.salary%TYPE;
BEGIN
SELECT salary INTO sal FROM employees where employee_id=60000;
IF sal > 100000
THEN RAISE sal_nul;
Else
dbms_output.put_line(‘vous pouvez augmenter le salaire de vos employés’);
END IF;
dbms_output.put_line(‘ Bye’);
EXCEPTION
WHEN sal_nul THEN
dbms_output.put_line(‘plafond dépassé’);
When zero_divide then
dbms_output.put_line(‘attention ‘);
END;
Exceptions Prédéfinies
• DUP_VAL_ON_INDEX
– Lorsqu’une instruction SQL tente de créer une valeur dupliquée dans
une colonne sur laquelle un index unique a été défini
• INVALID_NUMBER
– Lorsqu’une instruction SQL spécifie un nombre invalide (conversion
d’un caractère à un entité
ex: select * from employees where employee_id=‘Chaine_de_caractère‘
- lors d’une insertion
• NO_DATA_FOUND
– Lorsqu’une instruction Select ne retourne aucune ligne
• TOO_MANY_ROWS
– Une instruction Select ne peut pas renvoyer plus d’une ligne sans
provoquer l’exception TOO_MANY_ROWS
• VALUE_ERROR
– Provoquée dans des situations d’erreur résultant de valeurs
tronquées ou converties ( exp: taille de la variable petite que le
nombre à affecter)
• ZERO_DIVIDE: au cas ou il y a une instruction qui effectue une division par
Zéro
Exemple
Declare emp_Rec employees%ROWTYPE;
Begin
select *
into emp_Rec
from employees
where employee_ID = 777;
Exception
when No_Data_Found then
dbms_output.put_line(‘Aucune donnée retournée’);
when other then null;
End;
/
Aucune donnée retournée
Procedure PL/SQL terminé avec succès.
Déclaration d’une Exception
Declare
pas_comm EXCEPTION;
salaire employees.salary%TYPE;
commi employees.commition%TYPE;
numero employees.employee_id%TYPE;
Begin
Select salary, commition, employee_id into salaire, commi, numero
from employees where employee_id := &num_emp;
If commi = 0 or commi is null
then raise pas_comm
else traitement …
end if;
Exception When pas_comm then
dbms_output.put_line(‘ Pas de commission pour l’employé ID: ’|| numero);
End;
NB: num_emp fait référence à une variable extérieure au bloc
PL/SQL)
Test d’exécution avec SQLCODE et SQLERRM
• SQLCODE
– Fonction prédéfinie qui renvoie le statut d’erreur système de l’instruction
qui vient d’être exécutée (si sans erreur, SQLCODE = 0).
• SQLERRM
– Fonction prédéfinie qui renvoie le message d’erreur associé à la valeur
retournée par SQLCODE (si sans erreur, SQLERRM = ‘ORA-0000’).
Declare
Begin
dbms_output.enable; // equivalente à set serveroutput on
dbms_output.put_line(‘SQLCODE: ‘ || to_char(SQLCODE));
dbms_output.put_line(‘SQLERRM: ‘ || SQLERRM);
End;
/
SQLCODE: 0
SQLERRM: ORA-0000: exécution normale, terminé avec succès
Exemple 1:
Declare
v number;
Begin
select salary into v from employees;
dbms_output.enable; -- equivalente à set serveroutput on
Exception
when TOO_MANY_ROWS then
dbms_output.put_line('SQLCODE:'|| to_char(SQLCODE));
dbms_output.put_line('SQLERRM:' || SQLERRM);
End;
Test d’exécution avec SQLCODE et SQLERRM
Exemple 2:
Declare
pas_err EXCEPTION;
v number;
Begin
select salary into v from employees where employee_id=100;
if(SQLCODE=0) then raise pas_err;
end if;
Exception
when TOO_MANY_ROWS then
dbms_output.put_line('SQLCODE:'|| to_char(SQLCODE));
dbms_output.put_line('SQLERRM:' || SQLERRM);
when NO_DATA_FOUND OR TOO_MANY_ROWS then
dbms_output.put_line('SQLCODE:'|| to_char(SQLCODE));
dbms_output.put_line('SQLERRM:' || SQLERRM);
WHEN pas_err THEN
dbms_output.put_line('C''est corecte ');
End;
Test d’exécution avec SQLCODE et SQLERRM
Exemple 3: complet
Les curseur
• Définition
– Un curseur est un mécanisme permettant de rechercher
un nombre arbitraire de lignes avec une instruction
SELECT.
• Deux types de curseurs:
– Le curseurs implicite: généré et géré par le noyau pour
chaque ordre SQL d’un bloc
– Le curseur explicite: généré para l’utilisateur pour traiter
un ordre SELECT qui ramène plusieurs lignes.
Quatre Étapes de traitement d’un curseur
explicite
Les curseurs explicites sont traitées en suivant un modèle en
quatre étapes.
 Déclarer le CURSEUR: le curseur doit apparaitre dans la partie
déclaration de bloc pl/sql
 Ouvrir le CURSEUR : par l’instruction OPEN,
 Parcourir les ligne du CURSEUR : par l’ instruction
FETCH.
 Fermer le CURSEUR : une instruction close .
Déclaration d’un curseur explicite
• Se fait dans la section Declare
Syntaxe : cursor nom_curseur is ordre_select
Declare
cursor dept_10 is select first_name , salary From employees
where department_id= 10 order by salary;
nom employees .first_name%TYPE;
salaire employees . salary%TYPE;
Begin
…
End;
Exemple :
• L’ouverture:
– Allocation de mémoire pour le lignes du curseur
– L’analyse syntaxique et sémantique du select
– Le positionnement de verrous éventuels
• L’ouverture se fait dans la section Begin
• Syntaxe: OPEN nom_curseur;
Declare
cursor dept_10 is select first_name , salary From employees
where department_id= 10 order by salary;
Begin
…;
open dept_10;
…;
End;
Ouverture d’un curseur : Open
 Les lignes ramenées sont traitées une par une,
la valeur de chaque colonne doit être stockée dans
une variable réceptrice
 Syntaxe:
Fetch nom_curseur into liste_variables;
 Le Fetch ramène une ligne à la fois.
Traitement des lignes : Fetch
Exemple : Fetch
Declare
cursor dept_30 is select first_name , salary From employees
where department_id= 30 order by salary;
nom employees .first_name%TYPE;
salaire employees . salary%TYPE;
Begin
Open dept_30;
Loop
Fetch dept_30 into nom, salaire;
If salaire > 2500
then insert into résultat values (nom,salaire);
end if;
exit when salaire >= 5000;
end loop;
…
End;
Fermeture : close
• Syntaxe: Close nom_curseur;
• Action: libère la place de mémoire
Declare
cursor dept_10 is select first_name , salary From employees
where department_id= 10 order by salary;
nom employees .first_name%TYPE;
salaire employees . salary%TYPE;
Begin
Open dept_10;
Loop
Fetch dept_10 into nom, salaire;
If salaire > 2500 then
insert into résultat values (nom,salaire);
end if;
exit when salaire >= 5000;
end loop;
close dept_10;
End;
Exemple : close
Declare
Cursor c1 is select first_name, salary from employees order by
sal desc;
v_ename employees. first_name %TYPE;
v_sal employees.salary%TYPE;
Begin
open c1;
loop
fetch c1 into v_ename, v_sal;
Exit when (c1%notfound) ;
insert into resultat values (v_sal, v_ename);
end loop;
close c1
End;
• Définition indicateurs sur l’état d’un curseur.
 %FOUND : nom_curseur%FOUND
 TRUE: le dernier FETCH a ramené une ligne
 FALSE: plus de ligne
 %NOTFOUND: nom_curseur%NOTFOUND
 TRUE: le dernier FETCH n’a pas ramené de ligne
 %ISOPEN: nom_curseur%ISOPEN
 TRUE: le curseur est ouvert
 %ROWCOUNT: nom_curseur%rowcount
 Nbre de lignes ramenées par le Fetch
Les attributs d’un curseur
Pour manipuler les attribut d’un curseur implicite on utilise
SQL%Attribut
Exemples :
 SQL%FOUND ,
SQL% ROWCOUNT
Pour manipuler les attribut d’ un curseur explicite on utilise
nom_curseur%Attribut
Exemples :
nom_curseur%FOUND ,
nom_curseur % ROWCOUNT)
Utilisation des attribut du curseur
Utilisation des attribut du curseur
Curseur Implicite : utilisation de l’attribut par SQL%Attribut
CREATE TABLE temp_Employee9 AS SELECT * FROM Employees;
DECLARE
e_DeptNumber employees.Department_id%TYPE :=9;
BEGIN
DELETE FROM temp_Employee9
WHERE Department_id <> e_DeptNumber;
IF SQL%FOUND THEN – Il y a des enregistrement supprimmée
DBMS_OUTPUT.PUT_LINE('Nombre des enregistrement
supprimés: ‘ || TO_CHAR(SQL%ROWCOUNT));
ELSE
DBMS_OUTPUT.PUT_LINE('AUCUN enregistrement
n''supprimés ');
END IF;
END;
Exemple - %FOUND
Declare
cursor dept_ 30 is select first_name , salary From employees
where department_id= 30 order by salary;
nom employees .first_name%TYPE;
salaire employees . salary%TYPE;
Begin
Open dept_30;
Fetch dept_30 into nom, salaire;
While dept_30%FOUND Loop
If salaire > 2500 then insert into résultat values (nom,salaire);
end if;
Fetch dept_30 into nom, salaire;
end loop;
close dept_30;
End;
Exemple - %NOTFOUND
Declare
cursor dept_10 is select first_name , salary From employees
where department_id= 10 order by salary;
nom employees .first_name%TYPE;
salaire employees . salary%TYPE;
Begin
Open dept_10;
Loop
Fetch dept_10 into nom, salaire;
Exit when dept_10%NOTFOUND;
If salaire > 2500 then
bdms_output.put_line( nom ||’ ,’ ||salaire);
end if;
end loop;
close dept_10;
End;
Exemple - %ISOPEN
Declare
cursor dept_10 is select first_name , salary From employees
where department_id= 10 order by salary;
nom employees .first_name%TYPE;
salaire employees . salary%TYPE;
Begin
If not(dept_10%ISOPEN) then
Open dept_10;
end if;
Loop
Fetch dept_10 into nom, salaire;
Exit when dept_10%NOTFOUND;
If salaire > 2500 then
insert into résultat values (nom,salaire);
end if;
end loop;
close dept_10;
End;
Exemple - %ROWCOUNT
Declare
cursor dept_10 is select first_name , salary From employees
where department_id= 10 order by salary;
nom employees .first_name%TYPE;
salaire employees . salary%TYPE;
Begin
Open dept_10;
Loop
Fetch dept_10 into nom, salaire;
Exit when dept_10%NOTFOUND or dept_10%ROWCOUNT > 15;
If salaire > 2500
then insert into résultat values (nom,salaire);
end if;
end loop;
close dept_10;
End;
Boucle LOOP Exit when pour un curseur
declare
cursor c is
select department_id, first_name from employees
where department_id = 10;
Name employees.first_name%type;
Dept employees. department_id%type;
Begin
Open c;
LOOP
FETCH c into dept, name ;
Exit when c%NOTFOUND ;
dbms_output.put_line(name );
END LOOP;
CLOSE c;
end;
Dans cette boucle on est
obligé d’utiliser :
Open
LOOP
FETCH
CLOSE
Exit when
Utiliser WHILE élimine le
besoin de l’instruction EXIT
WHEN en intégrant l'utilisation
de l'attribut % FOUND.
2 instructions FETCH (Une juste
avant le while et l’autre avant le
END LOOP)
Boucle WHILE pour un curseur
declare
cursor c is select department_id, first_name
from employees
where department_id = 10;
Name employees.first_name%type;
Dept employees.department_id%type;
Begin
Open c;
FETCH c into dept, name ;
while c%FOUND loop
dbms_output.put_line(name);
FETCH c into dept, name ;
End loop;
CLOSE c;
end;
‰
Elle simplifie la programmation car elle évite d’utiliser explicitement les
instruction open, fetch, close, exit
‰
En plus elle déclare implicitement une variable de type « row » associée
au curseur
Boucle FOR pour un curseur
declare
cursor c is
select department_id, first_name from employees
where department_id = 10;
begin
FOR emp IN c LOOP
dbms_output.put_line(emp.first_name);
END LOOP;
end;
declare
n NUMBER := 14;
CURSOR C IS SELECT * FROM EMPLOYEES WHERE employee_id>= n ;
BEGIN
FOR CUR IN C LOOP
DBMS_OUTPUT.PUT_LINE ( CUR.FIRST_NAME) ;
END LOOP ;
END ;
/
Curseur avec des paramètres
A votre avis, le code suivant est-il valide ?
Non. La requête d’un curseur ne peut pas contenir de variables dont les
valeurs ne sont pas fixées.
Pourquoi ? Parce que les valeurs des ces variables sont susceptibles de
changer entre la déclaration du curseur et son ouverture.
Le remède est un curseur paramétré.
Vous pouvez modifier les lignes de données renvoyées dans un jeu de
résultats en généralisant code PL/SQL grâce à l'utilisation des paramètres.
Les paramètres peuvent être utilisés pour spécifier les critères de sélection
de la requête lorsque vous ouvrez le curseur.
Déclarer curseurs entre parenthèses par nom et type de données, comme
indiqué ici. Lorsque vous avez besoin de spécifier plusieurs parameter pour
un curseurs, séparez les entrées par une virgule.
 La syntaxe est :
CURSOR mycursor (param1 NUMBER, param2, type2 ....,
paramn typen ) IS SELECT ...... FROM tables WHERE
(condition sur les parameters)
Curseur avec des paramètres
Curseur avec des paramètres
Ouverture
On ouvre un curseur paramétré en passant en paramètre
les valeurs des variables :
OPEN Nom_curseur ( liste de sparamètres )
Exemple OPEN enfants ( 1 ) ;
Lecture par la Boucle FOR
FOR variable IN nom_curseur ( liste paramètre s )
LOOP
/∗ instructions ∗/
END LOOP ;
Declare
CURSOR mycursor (param1 number, param2 number) is select Employee_ID ,
salary
from employees where employee_id between param1 and param2;
e_Record mycursor%rowtype;
BEGIN
OPEN mycursor('102','110');
FETCH mycursor INTO e_Record;
loop
DBMS_OUTPUT.PUT_LINE('Salare de ' || e_Record.Employee_ID || ': ' ||
e_Record.Salary ||' $');
FETCH mycursor INTO e_Record;
exit when mycursor%notfound;
end loop;
CLOSE mycursor;
/
Passer des paramètres à un curseur
Exemple Recapitulatif
Exercices :
1) En utilisant un Curseur, Écrivez un programme PL/SQL qui
calcule la moyenne des salaires des employés dont la date de
recrutement est entre 01/01/2002 et 01/01/2005.
Comparer avec la requête ci-dessous, vous devez trouver la
même chose
(SELECT avg(salary) FROM employees
WHERE ( to_date(hire_date,'DD/MM/YY') between '01/01/02' and
'01/01/05' );
2) Refaire la meme question en passant les deux dates
01/01/2002 et 01/01/2005. En paramètre de curseur
Procédures et Fonctions stockées
Décrire les différentes utilisation des procédure
et fonctions
Créer des procédures et fonction stockées
Appeler une procédure et une fonction
Supprimer une procédure et une fonction
Objectifs:
Procédures stockées
Tout comme n’importe quel autre langage procédural, PL / SQL a des
blocs de code qui sont appelées procédures.
Vous pouvez appeler ces procédures par les autres blocs de code, ou
directement à partir de SQL * Plus (ou par un autre programme client).
GRANT CREATE PROCEDURE TO utilisateur_désiré;
Avant de créer des procédure il faut avoir les droits nécessaire
CREATE or replace PROCEDURE Bonjour IS
BEGIN
DBMS_OUTPUT.PUT_LINE(‘Bonjour Tout le monde’ );
END;
Procédures stockées
Un Simple exemple de procédure
Dans un autre bloc PL/SQL
BEGIN
Bonjour();
END;
Appel de la procédure
Par commande SQL*Plus
exec Bonjour();
Ou bien
Call Bonjour();
CREATE OR REPLACE
PROCEDURE nom_procedure ( paramètres IN , OUT ) IS
BEGIN
Corps_de_la_procedure
END;
nom_procedure : est le nom de la procédure, il doit être significatif
Corps_de_la_procedure: est une suite d’instruction PL/SQL qui
définissent la suite logique de la procédure
Procédures stockées
Syntaxe générale
Paramètres
Les paramètres sont optionnels dans les procédure, dans
l’exemple que nous avons déjà vu il n y a pas de paramètres
CREATE OR REPLACE
PROCEDURE HELLOWORLD IS
BEGIN
DBMS_OUTPUT.PUT_LINE(’Hello World!’);
END;
Procédures stockées
Où cas où il y a des paramètres on les introduit comme on le fait
lors de la création des tables  (nom_param type )
Exemple ( N int , titre varchar)
CREATE OR REPLACE
PROCEDURE DISPN (N INT) IS
BEGIN
DBMS_OUTPUT.PUT_LINE(‘N est : ‘ || N);
END;
Nous allons écrire une simple procédure admettant un seul
paramètre
Cette procédure affiche la valeur de nombre N passé
en paramètre
SQL>call DISPN(555)
N est : 555
1 seul paramètre: Exemple
Procédures stockées
CREATE OR REPLACE
PROCEDURE DISP_AB (A INT, B INT) IS
BEGIN
DBMS_OUTPUT.PUT_LINE(’A + B = ’ || (A + B));
DBMS_OUTPUT.PUT_LINE(’A * B = ’ || (A * B));
END;
Plusieurs paramètres: Exemple
Procédures stockées
SQL> CALL DISP_AB(17,23);
A + B = 40
A * B = 391
paramètres: Exemple avec une chaine de caractère
Procédures stockées
CREATE OR REPLACE
PROCEDURE DISP_NAME (NAME VARCHAR) IS
BEGIN
DBMS_OUTPUT.PUT_LINE(’Hi ’ || NAME || ’!’);
END;
SQL> CALL DISP_NAME(’Billal Merssi’);
Hi Billal Berssi !
Quand on ne fait pas d’option les paramètres sont
considérer comme IN par défaut
IN : pour un paramètre en entrer  il est généralement
placé après l’affectation ( := )
OUT: pour un paramètre qui va recevoir des données dans le
corps de la procédure il est généralement placé avant
l’affectation ( := )
IN OUT: pour des paramètre qui sont à la fois des IN et des
OUT
Options : IN, OUT, IN OUT
Procédures stockées
CREATE OR REPLACE
PROCEDURE SUM_AB (A INT, B INT, C OUT INT) IS
BEGIN
C := A + B;
END;
DECLARE
R INT;
BEGIN
SUM_AB(23,29,R);
DBMS_OUTPUT.PUT_LINE(’SUM IS: ’ || R);
END;
Options : IN, OUT, IN OUT: exemple
Procédures stockées
Faites appel à la procédure dans un bloc PL/SQL !
CREATE OR REPLACE
PROCEDURE DOUBLEN (N IN OUT INT) IS
BEGIN
N := N * 2;
END;
DECLARE
R INT;
BEGIN
R := 7;
DBMS_OUTPUT.PUT_LINE(’BEFORE CALL R IS: ’ || R);
DOUBLEN(R);
DBMS_OUTPUT.PUT_LINE(’AFTER CALL R IS: ’ || R);
END;
Faites appel à la procédure dans un bloc PL/SQL !
Exemple avec : IN OUT
Procédures stockées
CREATE PPROCEDURE baisse_prix( nprod IN NUMBER, Taux IN
NUMBER ) IS
BEGIN
if Taux <1 then
UPDATE produit SET PU= PU* ( 1 - Taux) WHERE Nump= nprod ;
end if;
END
Procédures stockées
Exemple : Créer une procédure qui permet de baisser le prix d'un produit de
la table: Produit (Nump, nomp, pu, qstock)
Une fonction est un bloc PL/SQL nommé qui peut accepter des
paramètres et être appelé.
En règle générale, vous utilisez une fonction pour calculer une
valeur
Une fonction doit comporter une clause RETURN dans l'en-tête,
et au moins une instruction RETURN dans la section exécutable.
Les fonctions peuvent être stockées en tant qu'objets de schéma
dans la base de données en vue d'exécutions répétées.
Fonctions stockées
Fonctions stockées
CREATE [OR REPLACE] FUNCTION num_fonction [(
param1 [mod1] datatype1, param2 [mod2] datatype 2,
….)]
RETURN datatype
IS|AS
Block PL/SQL ;
Syntaxe pour créer une fonction
Paramètre Description
function_name Nom de la fonction.
parameter Nom d'une variable PL/SQL dont la valeur est transmise à
la fonction.
mode Type du paramètre. Seuls les paramètres IN doivent être
déclarés.
datatype Type de données du paramètre.
RETURN datatype Type de données de la valeur RETURN qui doit être fournie
par la fonction.
PL/SQL block Corps de la procédure qui définit l'action exécutée par la
fonction.
Fonctions stockées
Description des paramètres
Fonctions stockées
Exemple de création d’une fonction stockée
get_salaty.sql
create or replace function get_sal
(p_id in employees.employee_id%type)
return number
is
v_salary employees.salary%type:=0;
begin
select salary into v_salary from employees where
employee_id=p_id;
return v_salary;
end ;
/
1- Créez le script pour définir la fonction get_salary. avec un
paramètre IN pour renvoyer une valeur numérique.
2- Exécutez le script pour créer la fonction get_salary.
3- Appelez la fonction dans une expression PL/SQL, pour elle
renverra une valeur à l'environnement appelant, ( par exemple
affichage la valeur )
Remarque:
- La section de traitement des exceptions peut également contenir
une instruction RETURN.
Fonctions stockées
Exemple suite
Fonctions stockées
Appel d'une procédure ou fonction
SQL> Declare
A employees.employee_id%type;
S number
BEGIN
A := &Numero_de_employe; --lire à partir du clavier
S :=get_sal (A);
dbms_output.put__line(S );
END ;
/
Exemple 2
-Créer une fonction TAX qui sera appelée à partir d'une instruction SELECT.
- La fonction accepte un paramètre NUMBER et renvoie la taxe après avoir
multiplié la valeur du paramètre par 0,08.
Create or replace function tax( p_value in number) Return number is
Begin
Return (p_value * 0.08);
End tax;
Fonctions stockées
SELECT employee_id, first_name,tax(salary) FROM employees
WHERE tax(salary)>(SELECT MAX(tax(salary)) FROM employees
WHERE department_id = 30) ORDER BY tax(salary) DESC;
- Appelez la fonction TAX au sein d'une interrogation affichant:
le code, le nom le prélèvement fiscal de l'employé dont la tax est sup au
max des tax de département 30
Appel d'une procédure ou fonction (suite)
Si la base de données évolue, il faut recompiler les procédures
existantes pour qu’elles tiennent compte de ces modifications
La commande est la suivante:
ALTER { FUNCTION | PROCEDURE } nom COMPILE
Exemple:
ALTER PROCEDURE Baisse_prix COMPILE;
ALTER FUNCTION NomClient COMPILE;
Fonctions stockées
Modification d’une procédure ou fonction
Lorsqu'une fonction stockée n'est plus nécessaire, vous pouvez
la supprimer en utilisant une instruction SQL
Pour supprimer une fonction stockée en exécutant
la commande SQL
DROP FUNCTION nom_fonction
DROP PROCEDURE nom_procedure;
La commande CREATE OR REPLACE est comparé à
DROP puis CREATE
Supprimer des fonctions et procédure
Fonctions stockées
•Un bloc PL/SQL peut contenir un sous bloc:
Declare
Variables
Begin
…..
Declare
Variables
Begin
….
End;
…..
End;
Les sous-blocs
Declare
a number; b varchar2(30); c number;
Begin
a:=10; b:='Imagination'; c:= 20;
Declare
d number;
Begin
d:=c+5;
a:=40 ;b:='programmation';
End;
b:=b||' Esprit'; a:=a+d;
dbms_output.put_line(a||'' ''||b||'' ''||c));
End;
Exemple
Les sous-blocs
Les Déclencheurs (Triggers) DANS PL/SQL
 Définir un Déclencheur (Trigger)
 Décrire les différents types de triggers
 Décrire les triggers de la base de données et leurs utilisation
 Créer des triggers
 Décrire les régles de déclenchement des triggers
 Gérer ( supp. , modif, dé/activation les triggers
Définition :
Un Trigger : Est un bloc ou d'une procédure PL / SQL
associé à une table, une vue, un schéma ou à une donnée
qui s’exécute implicitement(automatiquement) à chaque
fois qu'un événement particulier a lieu.
Les Déclencheurs (Triggers) DANS PL/SQL
Type de Triggers
Triggers d’application: est déclenché chaque fois qu'un événement se
produit avec une application particulière
Triggers base de données: est déclenché chaque fois qu'un
événement de données (comme DML) ou un événement du système
(telles que l'ouverture de session ou d'arrêt) se produit sur un schéma
ou base de données
Directives pour la conception Triggers
Les Déclencheurs (Triggers) DANS PL/SQL
Vous pouvez concevoir les Triggers pour :
 Effectuer des actions connexes
 Centraliser des opérations globales
Vous ne devez pas concevoir Triggers Si :
 Leurs fonctionnalités est déjà intégrée dans le serveur Oracle
 ils dupliquent la même tache d'autres Triggers
Vous pouvez créer des procédures stockées et les invoquer dans un
Triggers, si le code PL / SQL est très longue.
L'utilisation excessive de Triggers peut entraîner des interdépendances
complexes, ce qui peut être difficile à maintenir dans de grandes
applications
CREATION de TRIGGER
Les Déclencheurs (Triggers) DANS PL/SQL
CREATE [OR REPLACE] TRIGGER nom_trigger
Quand
Evenement 1 [OR Evenement 2 OR Evenement3]
ON nom_Objet
[[REFERENCING OLD AS old | NEW AS new]
FOR EACH ROW // pour chaque ligne
[WHEN (condition)]]
Begin
Corps de trigger (PL/SQL bloc )
End;
nom_trigger : unique pour les trigger du meme schéma.
Quant : indique quand le trigger va se déclancher en fonction
avec l’evenement qui va se passer dans la BD :
BEFORE, AFTER, et INSTEAD OF.
Evenement : identifie l’opération DML qui provoque le declenchement
INSERT, UPDATE [OF column], et DELETE.
Nom_objet : indique la table ou la vue associés au trigger.
Les composantes de la syntaxe de creation de Triggers :
Les Déclencheurs (Triggers) DANS PL/SQL
Pour le trigger ligne vous pouvez specifier :
REFERENCING : pour corréler les valeur old et new pour la ligne
courante (par default OLD et NEW)
FOR EACH ROW : pour indiquer que le trigger est une trigger ligne
WHEN : clause pour appliquer un filtre, qui sera mis entre
parentheses,
Corps de trigger : C’est l’action à efectuer par le trigger, qui est
implementé comme suit:
 Un bloc anonyme PL/SQL (DECLARE ou BEGIN, et
un END)
 Appel à une procedure/fonction stoquée ou bien un
package (CALL , EXECUTE)
Les composantes de la syntaxe de creation de Triggers
(Suite) :
Les Déclencheurs (Triggers) DANS PL/SQL
Le type de trigger DML determine Si le Corps de trigger s’exécute pour
chaque ligne ou une seule fois pour l’evenement déclanchant:
Type 1: Les trigger de table (Trigger STATEMENT) :
Excecutés une fois pour l’evenement déclanchante
C’est le type par défaut des triggers
Déclanchés meme s’il n y a aucune ligne affécté par l”evnement
Type 2: Les Triggers ligne :
Exécutés « séparément » pour chaque ligne affécté par l”evnement
Ne sont pas executé Si l’evenement n’a affecté aucun ligne
Sont indiqués en précisant la clause FOR EACH ROW
Types de Triggers DML
Les Déclencheurs (Triggers) DANS PL/SQL
Quand le trigger se déclence ?
BEFORE: (Avant) Executer le trigger avant de proceder à
l’evenement DML sur la table.
AFTER (Aprés) Executer le trigger aprés l’evenement DML sur la
table.
INSTEAD OF: (au lieu de) Executer le corps de trigger au lieu de
l’évenement. Ceci est utilisé pour les VUES qui ne sont pas
modifiable
Note: Si plusieurs Triggers sont définis pour un meme objet leurs
déclancement est arbitraire
Les Déclencheurs (Triggers) DANS PL/SQL
Séquence de déclenchement de Trigger
Utilisez la séquence de déclenchement suivante pour un Trigger
sur une table quand une seule ligne est manipulé:
INSERT INTO departments (department_id,department_name,
location_id) VALUES (400, 'CONSULTING', 2400);
.…
BEFORE avant le trigger tables
BEFORE avant le trigger ligne
AFTER Aprés le trigger ligne
AFTER Aprésle trigger tables
… … …
Les Déclencheurs (Triggers) DANS PL/SQL
UPDATE employees SET salary = salary * 1.1
WHERE department_id = 30;
BEFORE avant le trigger tables
AFTER (Aprés )le trigger tables
BEFORE (avant) le trigger ligne
AFTER (aprés) le trigger ligne
BEFORE (avant) le trigger ligne
AFTER (aprés) le trigger ligne
….
….
Les Déclencheurs (Triggers) DANS PL/SQL
Les types d’événement et le corps de triggers
Événement de trigger :
Determine quel Order DML va déclencher l’execution de
trigger. Ils sont :
INSERT
UPDATE [OF column]
DELETE
Corps de triggers :
Détermine l'action a effectuée
Est-ce un bloc PL / SQL ou un appel à une procédure
Les Déclencheurs (Triggers) DANS PL/SQL
Application
INSERT INTO EMPLOYEES...;
table EMPLOYEES
trigger SECURE_EMP
CREATE OR REPLACE TRIGGER secure_emp
BEFORE INSERT ON employees
BEGIN
IF (TO_CHAR(SYSDATE,'DY') IN ('DIM.','SAM.')) OR
(TO_CHAR(SYSDATE,'HH24:MI') NOT BETWEEN '08:00' AND ‘18:00')
then
RAISE_APPLICATION_ERROR(-20500,'Vous ne pouvez inserer dans la table
employes que durant les heures de travail');
END IF;
END;
Les Déclencheurs (Triggers) DANS PL/SQL
Création d’un trigger pour sécurisé l’insertion dans la table employees
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt
Base de donnees Avancees et Intro à  NoSQL.ppt

Contenu connexe

Tendances

Cours python avancé
Cours python avancéCours python avancé
Cours python avancépierrepo
 
HTML, CSS et Javascript
HTML, CSS et JavascriptHTML, CSS et Javascript
HTML, CSS et Javascript
ECAM Brussels Engineering School
 
JDBC: Gestion des bases de données en Java
JDBC: Gestion des bases de données en Java JDBC: Gestion des bases de données en Java
JDBC: Gestion des bases de données en Java
Youness Boukouchi
 
Tp Sql Server Integration Services 2008
Tp  Sql Server Integration Services  2008Tp  Sql Server Integration Services  2008
Tp Sql Server Integration Services 2008
Abdelouahed Abdou
 
Les Contraintes | SQL Oracle
Les Contraintes | SQL OracleLes Contraintes | SQL Oracle
Les Contraintes | SQL Oracle
webreaker
 
Python avancé : Classe et objet
Python avancé : Classe et objetPython avancé : Classe et objet
Python avancé : Classe et objet
ECAM Brussels Engineering School
 
Telecharger Exercices corrigés PL/SQL
Telecharger Exercices corrigés PL/SQLTelecharger Exercices corrigés PL/SQL
Telecharger Exercices corrigés PL/SQL
webreaker
 
T1 corrections-qcm
T1 corrections-qcmT1 corrections-qcm
T1 corrections-qcminfcom
 
Introduction à l’orienté objet en Python
Introduction à l’orienté objet en PythonIntroduction à l’orienté objet en Python
Introduction à l’orienté objet en Python
Abdoulaye Dieng
 
Les règles de passage
Les règles de passageLes règles de passage
Les règles de passage
marwa baich
 
Cours bases de données partie 1 Prof. Khalifa MANSOURI
Cours bases de données partie 1 Prof. Khalifa MANSOURICours bases de données partie 1 Prof. Khalifa MANSOURI
Cours bases de données partie 1 Prof. Khalifa MANSOURI
Mansouri Khalifa
 
Cours python
Cours pythonCours python
Cours pythonsalmazen
 
Cours Système d'Information
Cours Système d'InformationCours Système d'Information
Cours Système d'Information
Badiâa Dellal-Hedjazi
 
Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)
Martin Latrille
 
Introduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El HassaniIntroduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El Hassani
Shellmates
 
Corrige tp java
Corrige tp javaCorrige tp java
Corrige tp java
Maya Medjdoub
 
Presentation sql
Presentation sqlPresentation sql
Presentation sql
maaroufi amine
 
Mise en Forme des Résultats avec SQL*Plus
Mise en Forme des Résultats avec SQL*PlusMise en Forme des Résultats avec SQL*Plus
Mise en Forme des Résultats avec SQL*Plus
webreaker
 
La programmation modulaire en Python
La programmation modulaire en PythonLa programmation modulaire en Python
La programmation modulaire en Python
ABDESSELAM ARROU
 
Introduction à Python
Introduction à PythonIntroduction à Python
Introduction à Python
Abdoulaye Dieng
 

Tendances (20)

Cours python avancé
Cours python avancéCours python avancé
Cours python avancé
 
HTML, CSS et Javascript
HTML, CSS et JavascriptHTML, CSS et Javascript
HTML, CSS et Javascript
 
JDBC: Gestion des bases de données en Java
JDBC: Gestion des bases de données en Java JDBC: Gestion des bases de données en Java
JDBC: Gestion des bases de données en Java
 
Tp Sql Server Integration Services 2008
Tp  Sql Server Integration Services  2008Tp  Sql Server Integration Services  2008
Tp Sql Server Integration Services 2008
 
Les Contraintes | SQL Oracle
Les Contraintes | SQL OracleLes Contraintes | SQL Oracle
Les Contraintes | SQL Oracle
 
Python avancé : Classe et objet
Python avancé : Classe et objetPython avancé : Classe et objet
Python avancé : Classe et objet
 
Telecharger Exercices corrigés PL/SQL
Telecharger Exercices corrigés PL/SQLTelecharger Exercices corrigés PL/SQL
Telecharger Exercices corrigés PL/SQL
 
T1 corrections-qcm
T1 corrections-qcmT1 corrections-qcm
T1 corrections-qcm
 
Introduction à l’orienté objet en Python
Introduction à l’orienté objet en PythonIntroduction à l’orienté objet en Python
Introduction à l’orienté objet en Python
 
Les règles de passage
Les règles de passageLes règles de passage
Les règles de passage
 
Cours bases de données partie 1 Prof. Khalifa MANSOURI
Cours bases de données partie 1 Prof. Khalifa MANSOURICours bases de données partie 1 Prof. Khalifa MANSOURI
Cours bases de données partie 1 Prof. Khalifa MANSOURI
 
Cours python
Cours pythonCours python
Cours python
 
Cours Système d'Information
Cours Système d'InformationCours Système d'Information
Cours Système d'Information
 
Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)
 
Introduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El HassaniIntroduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El Hassani
 
Corrige tp java
Corrige tp javaCorrige tp java
Corrige tp java
 
Presentation sql
Presentation sqlPresentation sql
Presentation sql
 
Mise en Forme des Résultats avec SQL*Plus
Mise en Forme des Résultats avec SQL*PlusMise en Forme des Résultats avec SQL*Plus
Mise en Forme des Résultats avec SQL*Plus
 
La programmation modulaire en Python
La programmation modulaire en PythonLa programmation modulaire en Python
La programmation modulaire en Python
 
Introduction à Python
Introduction à PythonIntroduction à Python
Introduction à Python
 

Similaire à Base de donnees Avancees et Intro à NoSQL.ppt

Intro_modul_et_SI_chapt0.ppt
Intro_modul_et_SI_chapt0.pptIntro_modul_et_SI_chapt0.ppt
Intro_modul_et_SI_chapt0.ppt
Idriss22
 
cours base de données
cours base de donnéescours base de données
cours base de données
Yassine Badri
 
java BDD jdbc
java BDD jdbcjava BDD jdbc
java BDD jdbcvangogue
 
Bases de donnees fondamentaux
Bases de donnees fondamentauxBases de donnees fondamentaux
Bases de donnees fondamentaux
Rokhaya CISSE
 
Intro SGBD et BD.ppt
Intro SGBD et BD.pptIntro SGBD et BD.ppt
Intro SGBD et BD.ppt
Bahaty1
 
Cours_BD_M1-EAI-2023.pdf
Cours_BD_M1-EAI-2023.pdfCours_BD_M1-EAI-2023.pdf
Cours_BD_M1-EAI-2023.pdf
stephanecoulibaly3
 
Cours Base de données relationnelles
Cours Base de données relationnellesCours Base de données relationnelles
Cours Base de données relationnelles
Aymen Kasmi
 
Chapitre1.pdf
Chapitre1.pdfChapitre1.pdf
Chapitre1.pdf
Moez Moezm
 
Bd relationnelles
Bd relationnellesBd relationnelles
Bd relationnelles
makram05
 
bases des données relationnelles pour les ue nfa008
bases des données relationnelles pour les ue nfa008bases des données relationnelles pour les ue nfa008
bases des données relationnelles pour les ue nfa008
AliHusseini14
 
11 visual basic .net - acces aux donnees avec ado .net
11 visual basic .net - acces aux donnees avec ado .net11 visual basic .net - acces aux donnees avec ado .net
11 visual basic .net - acces aux donnees avec ado .net
Hamza SAID
 
Le métier d’administrateur de
Le métier d’administrateur deLe métier d’administrateur de
Le métier d’administrateur deAlgeria JUG
 
Diaporamas-Bases de données.pdf
Diaporamas-Bases de données.pdfDiaporamas-Bases de données.pdf
Diaporamas-Bases de données.pdf
EST-UMI de Meknès
 
Chapt-1-Cours_BdD-Introduction-SEA-M1-2022 -V1.pdf
Chapt-1-Cours_BdD-Introduction-SEA-M1-2022 -V1.pdfChapt-1-Cours_BdD-Introduction-SEA-M1-2022 -V1.pdf
Chapt-1-Cours_BdD-Introduction-SEA-M1-2022 -V1.pdf
EnochBidima3
 
chapitre 4-bddistribuesgnralites.pptx
chapitre 4-bddistribuesgnralites.pptxchapitre 4-bddistribuesgnralites.pptx
chapitre 4-bddistribuesgnralites.pptx
Sylia3
 
Discovery Session France: Atelier découverte de la Data Virtualization
Discovery Session France: Atelier découverte de la Data VirtualizationDiscovery Session France: Atelier découverte de la Data Virtualization
Discovery Session France: Atelier découverte de la Data Virtualization
Denodo
 
Le m _tier_de_dba_797144552
Le m _tier_de_dba_797144552Le m _tier_de_dba_797144552
Le m _tier_de_dba_797144552
Algeria JUG
 
support_cours.pdf
support_cours.pdfsupport_cours.pdf
support_cours.pdf
MbarkiIsraa
 
Morning With MongoDB
Morning With MongoDBMorning With MongoDB
Morning With MongoDB
FastConnect
 

Similaire à Base de donnees Avancees et Intro à NoSQL.ppt (20)

Intro_modul_et_SI_chapt0.ppt
Intro_modul_et_SI_chapt0.pptIntro_modul_et_SI_chapt0.ppt
Intro_modul_et_SI_chapt0.ppt
 
cours base de données
cours base de donnéescours base de données
cours base de données
 
java BDD jdbc
java BDD jdbcjava BDD jdbc
java BDD jdbc
 
Bases de donnees fondamentaux
Bases de donnees fondamentauxBases de donnees fondamentaux
Bases de donnees fondamentaux
 
Intro SGBD et BD.ppt
Intro SGBD et BD.pptIntro SGBD et BD.ppt
Intro SGBD et BD.ppt
 
Cours_BD_M1-EAI-2023.pdf
Cours_BD_M1-EAI-2023.pdfCours_BD_M1-EAI-2023.pdf
Cours_BD_M1-EAI-2023.pdf
 
Cours Base de données relationnelles
Cours Base de données relationnellesCours Base de données relationnelles
Cours Base de données relationnelles
 
Chapitre1.pdf
Chapitre1.pdfChapitre1.pdf
Chapitre1.pdf
 
Bd relationnelles
Bd relationnellesBd relationnelles
Bd relationnelles
 
bases des données relationnelles pour les ue nfa008
bases des données relationnelles pour les ue nfa008bases des données relationnelles pour les ue nfa008
bases des données relationnelles pour les ue nfa008
 
11 visual basic .net - acces aux donnees avec ado .net
11 visual basic .net - acces aux donnees avec ado .net11 visual basic .net - acces aux donnees avec ado .net
11 visual basic .net - acces aux donnees avec ado .net
 
Le métier d’administrateur de
Le métier d’administrateur deLe métier d’administrateur de
Le métier d’administrateur de
 
Diaporamas-Bases de données.pdf
Diaporamas-Bases de données.pdfDiaporamas-Bases de données.pdf
Diaporamas-Bases de données.pdf
 
Chapt-1-Cours_BdD-Introduction-SEA-M1-2022 -V1.pdf
Chapt-1-Cours_BdD-Introduction-SEA-M1-2022 -V1.pdfChapt-1-Cours_BdD-Introduction-SEA-M1-2022 -V1.pdf
Chapt-1-Cours_BdD-Introduction-SEA-M1-2022 -V1.pdf
 
chapitre 4-bddistribuesgnralites.pptx
chapitre 4-bddistribuesgnralites.pptxchapitre 4-bddistribuesgnralites.pptx
chapitre 4-bddistribuesgnralites.pptx
 
Discovery Session France: Atelier découverte de la Data Virtualization
Discovery Session France: Atelier découverte de la Data VirtualizationDiscovery Session France: Atelier découverte de la Data Virtualization
Discovery Session France: Atelier découverte de la Data Virtualization
 
Le m _tier_de_dba_797144552
Le m _tier_de_dba_797144552Le m _tier_de_dba_797144552
Le m _tier_de_dba_797144552
 
Bases dedonnees.net
Bases dedonnees.netBases dedonnees.net
Bases dedonnees.net
 
support_cours.pdf
support_cours.pdfsupport_cours.pdf
support_cours.pdf
 
Morning With MongoDB
Morning With MongoDBMorning With MongoDB
Morning With MongoDB
 

Dernier

Burkina Faso library newsletter May 2024
Burkina Faso library newsletter May 2024Burkina Faso library newsletter May 2024
Burkina Faso library newsletter May 2024
Friends of African Village Libraries
 
Iris et les hommes.pptx
Iris      et         les      hommes.pptxIris      et         les      hommes.pptx
Iris et les hommes.pptx
Txaruka
 
Mémoire de licence en finance comptabilité et audit
Mémoire de licence en finance comptabilité et auditMémoire de licence en finance comptabilité et audit
Mémoire de licence en finance comptabilité et audit
MelDjobo
 
Impact des Critères Environnementaux, Sociaux et de Gouvernance (ESG) sur les...
Impact des Critères Environnementaux, Sociaux et de Gouvernance (ESG) sur les...Impact des Critères Environnementaux, Sociaux et de Gouvernance (ESG) sur les...
Impact des Critères Environnementaux, Sociaux et de Gouvernance (ESG) sur les...
mrelmejri
 
Iris van Herpen. pptx
Iris            van        Herpen.     pptxIris            van        Herpen.     pptx
Iris van Herpen. pptx
Txaruka
 
Conseils pour Les Jeunes | Conseils de La Vie| Conseil de La Jeunesse
Conseils pour Les Jeunes | Conseils de La Vie| Conseil de La JeunesseConseils pour Les Jeunes | Conseils de La Vie| Conseil de La Jeunesse
Conseils pour Les Jeunes | Conseils de La Vie| Conseil de La Jeunesse
Oscar Smith
 
Cours de conjugaison des verbes du premier, deuxième et troisième groupe
Cours de conjugaison des verbes du premier, deuxième et troisième groupeCours de conjugaison des verbes du premier, deuxième et troisième groupe
Cours de conjugaison des verbes du premier, deuxième et troisième groupe
Yuma91
 
Evaluación docentes "Un cielo, dos países: El camino de los descubrimientos"
Evaluación docentes "Un cielo, dos países: El camino de los descubrimientos"Evaluación docentes "Un cielo, dos países: El camino de los descubrimientos"
Evaluación docentes "Un cielo, dos países: El camino de los descubrimientos"
IES Turina/Rodrigo/Itaca/Palomeras
 
M2i Webinar - « Participation Financière Obligatoire » et CPF : une opportuni...
M2i Webinar - « Participation Financière Obligatoire » et CPF : une opportuni...M2i Webinar - « Participation Financière Obligatoire » et CPF : une opportuni...
M2i Webinar - « Participation Financière Obligatoire » et CPF : une opportuni...
M2i Formation
 
Edito-B1-francais Manuel to learning.pdf
Edito-B1-francais Manuel to learning.pdfEdito-B1-francais Manuel to learning.pdf
Edito-B1-francais Manuel to learning.pdf
WarlockeTamagafk
 
Formation Intelligence Artificielle pour dirigeants- IT6-DIGITALIX 24_opt OK_...
Formation Intelligence Artificielle pour dirigeants- IT6-DIGITALIX 24_opt OK_...Formation Intelligence Artificielle pour dirigeants- IT6-DIGITALIX 24_opt OK_...
Formation Intelligence Artificielle pour dirigeants- IT6-DIGITALIX 24_opt OK_...
cristionobedi
 
Système de gestion des fichiers de amine
Système de gestion des fichiers de amineSystème de gestion des fichiers de amine
Système de gestion des fichiers de amine
sewawillis
 
SYLLABUS DU COURS MARKETING DTS 1-2.pdf
SYLLABUS DU COURS  MARKETING DTS 1-2.pdfSYLLABUS DU COURS  MARKETING DTS 1-2.pdf
SYLLABUS DU COURS MARKETING DTS 1-2.pdf
Moukagni Evrard
 

Dernier (13)

Burkina Faso library newsletter May 2024
Burkina Faso library newsletter May 2024Burkina Faso library newsletter May 2024
Burkina Faso library newsletter May 2024
 
Iris et les hommes.pptx
Iris      et         les      hommes.pptxIris      et         les      hommes.pptx
Iris et les hommes.pptx
 
Mémoire de licence en finance comptabilité et audit
Mémoire de licence en finance comptabilité et auditMémoire de licence en finance comptabilité et audit
Mémoire de licence en finance comptabilité et audit
 
Impact des Critères Environnementaux, Sociaux et de Gouvernance (ESG) sur les...
Impact des Critères Environnementaux, Sociaux et de Gouvernance (ESG) sur les...Impact des Critères Environnementaux, Sociaux et de Gouvernance (ESG) sur les...
Impact des Critères Environnementaux, Sociaux et de Gouvernance (ESG) sur les...
 
Iris van Herpen. pptx
Iris            van        Herpen.     pptxIris            van        Herpen.     pptx
Iris van Herpen. pptx
 
Conseils pour Les Jeunes | Conseils de La Vie| Conseil de La Jeunesse
Conseils pour Les Jeunes | Conseils de La Vie| Conseil de La JeunesseConseils pour Les Jeunes | Conseils de La Vie| Conseil de La Jeunesse
Conseils pour Les Jeunes | Conseils de La Vie| Conseil de La Jeunesse
 
Cours de conjugaison des verbes du premier, deuxième et troisième groupe
Cours de conjugaison des verbes du premier, deuxième et troisième groupeCours de conjugaison des verbes du premier, deuxième et troisième groupe
Cours de conjugaison des verbes du premier, deuxième et troisième groupe
 
Evaluación docentes "Un cielo, dos países: El camino de los descubrimientos"
Evaluación docentes "Un cielo, dos países: El camino de los descubrimientos"Evaluación docentes "Un cielo, dos países: El camino de los descubrimientos"
Evaluación docentes "Un cielo, dos países: El camino de los descubrimientos"
 
M2i Webinar - « Participation Financière Obligatoire » et CPF : une opportuni...
M2i Webinar - « Participation Financière Obligatoire » et CPF : une opportuni...M2i Webinar - « Participation Financière Obligatoire » et CPF : une opportuni...
M2i Webinar - « Participation Financière Obligatoire » et CPF : une opportuni...
 
Edito-B1-francais Manuel to learning.pdf
Edito-B1-francais Manuel to learning.pdfEdito-B1-francais Manuel to learning.pdf
Edito-B1-francais Manuel to learning.pdf
 
Formation Intelligence Artificielle pour dirigeants- IT6-DIGITALIX 24_opt OK_...
Formation Intelligence Artificielle pour dirigeants- IT6-DIGITALIX 24_opt OK_...Formation Intelligence Artificielle pour dirigeants- IT6-DIGITALIX 24_opt OK_...
Formation Intelligence Artificielle pour dirigeants- IT6-DIGITALIX 24_opt OK_...
 
Système de gestion des fichiers de amine
Système de gestion des fichiers de amineSystème de gestion des fichiers de amine
Système de gestion des fichiers de amine
 
SYLLABUS DU COURS MARKETING DTS 1-2.pdf
SYLLABUS DU COURS  MARKETING DTS 1-2.pdfSYLLABUS DU COURS  MARKETING DTS 1-2.pdf
SYLLABUS DU COURS MARKETING DTS 1-2.pdf
 

Base de donnees Avancees et Intro à NoSQL.ppt

  • 1. 1 Filière (DUT) : Génie Informatique (S3) Année Universitaire : 2018/2019 au 2023/2024 Diaporamas du cours : Bases de données avancées Préparé par : Idriss CHANA Enseignant chercheur au Département Génie Informatique, EST-UMI Meknès Email : i.chana@umi.ac.ma Au Profit des Etudiants de La Deuxième Année de la filière GI inscrits en semestre S3
  • 2. Bases de données Avancées • Vous permettre d’ exploiter les fonctionnalités avancées d’un SGBDR. (vue, séquences, indexe, Synonymes, gestion des utilisateurs et leurs droits ….) • Vous permettre de maitriser l’outil PLSQL Manipulation et • Vous rendre capable de Programmer des procédures stockées et des déclencheurs (Triggers).en utilisant un SGBDR Oracle . • Vous permettre de vous initier au concept de Big Data et aux base de donnes NoSql 2 Objectif du module
  • 3.  Chap 1 : Introduction Générale : 1- Introduction sur les Base de données et SGBDR 2- Les fonctionnalités d’un SGBDR  Chap 2 : Rappel Langage SQL : Mode interactif Langage (LDD) et (LMD)  Chap 3 : Langage SQL avancé : 1. Les ordre SQL complexe ( agrégat , requête imbriquées, et la clause having) 2. La Création des Vues et des Index, les synonymes et Les Séquences 3. La Gestion de transactions  Chap 4 : Langage SQL en mode procédural (PL/SQL): 1. PL/SQL Déclaration des variables, ,Curseurs, et gestion des exceptions 2. Procédures et fonctions stockées 3. Les Déclencheurs (Triggers)  Chap 5 : Gestion et Administration des droits des Utilisateur Oracle 1. Dictionnaire de données , Gestion des utilisateurs 2. Privilèges et Rôle . Profil d'utilisateur . 3. Sécurité d’une base de données  Chap 6 : Base de Donnes NO SQL ( Mongo DB) 1. Introduction au Bid Data 2. Type de bases de données Nosql. 3. Base de données NoSQL Orientée Documents « MongoDB » Plan de module
  • 4. 4 -Cours et TD -Travaux Pratiques Modalité d’apprentissage
  • 6. Évaluation • Cours & TD 50% - DS théorique - Participation pendant des séances de TDs et de cours • TP 50% - DS Pratique - Participation active pendant des séances de TPs . - Rapport rendu à la fin des séances des TPs 6
  • 7. Chap I: Introduction aux bases de données et SGBD Information :C’est un élément de connaissance concernant des faits, des sujets ou des élément particulier Donnée: est une information quelconque, aussi c’est une relation entre des information Exemples : 1-Brahim est une personne 2- Brahim étudie les base de données Définitions 7
  • 8. • Persistance de données Entrée (données)+traitement Résultat durable . • Quantité très importante de données à gérer et à manipuler • Cohérence de données (intégrité ,identifiant..) • Non redondance de données Chap I: Introduction aux bases de données et SGBD 8 Organisation logique et physiques des donnés, indépendance des traitements Les Besoins :
  • 9. Historiquement l’information a vu trois approches  Approche Système de Gestion fichiers(SGF).  Approche Base de données gérées par les SGBD et SGBDR  Actuellement avec les Big data Sandbox ( données structurées et non structurées) Approches Gestions de l’information Chap I: Introduction aux bases de données et SGBD 9
  • 10. Approche Système de Gestion de fichiers Chap I :Introduction aux bases de données et SGBD Utilisation d’un ensemble de fichiers de données Définir les données en fonction des traitement (dépendance données/programmes) Toute application à ses propres programmes Inconvénient : Redondance (lorsque la volumétrie devient importante) Lourdeur d’accès aux données (lorsque la volumétrie devient importante) Difficulté des MAJ Risque de perdre l’intégrité des données 1
  • 11. Les données de la BD sont décrites hors des programmes Approche Base de données. Chap I :Introduction aux bases de données et SGBD Avantages : Pas de Redondance Vitesse d’accès au donnée Facilité des MAJ Respect de l’intégrité des données 11
  • 12. Chap I :Introduction aux bases de données et SGBD Que doit permettre un SGBDR ? 1-Décrire les données indépendamment des applications (de manière intrinsèque) Langage de Définition de Données (LDD) 2-Manipuler les données Interroger et mettre à jour les données sans préciser d'algorithme d'accès dire QUOI sans dire COMMENT langage de requêtes déclaratif ex.: quels sont les noms des produits de prix < 100DH ? Langage de Manipulation de Données (LMD) 12
  • 13. 3-Contrôler les données Intégrité ; vérification de contraintes d'intégrité ex.: la note doit être comprise entre 0 et 20 Chap I :Introduction aux bases de données et SGBD Que doit permettre un SGBD suite… ? Question1 :Si la secrétaire a saisi par erreur la note d’une matière (51/20 au lieu 15/20) qui ce qui se passe et comment remédier à cette situation ?????? Confidentialité : contrôle des droits d'accès, autorisation Question2 :est ce que un étudiant peut changer la note qu’ il a eu dans une matière donnée et comment géré ça ?????? Pour ces deux situation le SGBD doit permettre un : Langage de Contrôle de Données (CLD) 13
  • 14. 4-Partage Une BD est partagée entre plusieurs utilisateurs en même temps. Il en déroule donc : Un contrôle des accès concurrents. - notion de transaction L'exécution d'une transaction doit préserver la cohérence de la BD Que doit permettre un SGBD suite… ? Chap I :Introduction aux bases de données et SGBD Question3 :Si je suis à Meknès et j’ai un compte bancaire initialement ouvert à une agence bancaire située sur Rabat comment est ce que je peux consulté mon compte ?????? 14
  • 15. -Reprise après panne, journalisation - Contrôle d’accès index (hashage, arbres balancés ...) 5-Sécurité 6-Performances d'accès Que doit permettre un SGBD suite… ? Chap I:Introduction aux bases de données et SGBD 15
  • 16. 7-Indépendance physique Pouvoir modifier les structures de stockage ou les index sans que cela ait de répercussion au niveau des applications Les disques, les méthodes d’accès, les modes de placement, le codage des données ne sont pas apparents Permettre aux différentes applications d’avoir des vues différentes des mêmes données Permettre au administrateur de la base de modifier le schéma logique sans que cela ait de répercussion au niveau des applications 8-Indépendance logique Que doit permettre un SGBD suite… ? Chap I :Introduction aux bases de données et SGBD 16
  • 17. Structure de SGDB Chap I Introduction aux bases de données et SGBD 17
  • 18. Le concept de vue permet d'obtenir l'indépendance logique La modification du schéma logique n’entraîne pas la modification des applications (une modification des vues est cependant nécessaire) Chaque vue correspond à la perception d’une partie des données, mais aussi des données qui peuvent être synthétisées à partir des informations représentées dans la BD (par ex. statistiques) Le niveau Logique( conceptuel tables vues ect …. ) il contient la description des données et des contraintes d’intégrité (Dictionnaire de Données) le schéma logique découle d’une activité de modélisation Le niveau externe Le niveau interne ou dit physique il correspond aux structures de stockage et aux moyens d’accés Chap I: Introduction aux bases de données et SGBD Structure de SGDB Suite … 18
  • 19. Chap I: Introduction aux bases de données et SGBD 19 Résumé: Les fonctions des SGBD 1-DEFINITION DES DONNEES Langage de définition des données (DDL) (conforme à un modèle de données) 2-MANIPULATION DES DONNEES Interrogation Mise à jour(insertion, suppression, modification) Langage de manipulation des données (DML) (langage de requête déclaratif) 3-CONTRÔLE DES DONNEES Contraintes d'intégrité Contrôle des droits d'accès Gestion de transactions Langage de contrôle des données (DCL)
  • 20. Chap I :Introduction aux bases de données et SGBD 20
  • 21. Système de Gestion de Base de Données (SGBD) (DBMS en anglais ): programme qui permet la définition, la mise en œuvre, et l’exploitation d’une BD (à un niveau plus abstrait que celui fournit par les OS usuels (gestion de fichiers de droits etc. …)). 1) Base de données (BD)(DB en anglais ) : ensemble cohérent, intégre, partagé de données structurées défini pour les besoins d’une application Chap I: Introduction aux bases de données et SGBD 21 Questions 1) Donnez une définition aux : -Base de données -SGBD ? 2) Quel est le cycle de vie d’une base de données ? 2) Voir le slide précèdent
  • 22. 22 Maître d’oeuvrage Partie porteuse du besoin qui définit l’objet du projet, le calendrier et le budget Maître d’oeuvre Partie en charge de la réalisation technique du projet Acteurs de développement
  • 23. Chapitre 2: SQL : LDD, LMD et contraintes Rappel Langage SQL-LDD et LMD :  Langages (LDD)  Langages (LMD)  Les contrainte d’intégrité CIF et CIR  Exercices d’application
  • 24. SQL ne se résume pas aux requêtes d'interrogation d'une base. Ce langage permet aussi de : - créer des tables - de modifier la structure de tables existantes - de modifier le contenu des tables Le LDD est le Langage de Définition de Données (DDL en anglais). Il permet de:  créer des tables par l'instruction CREATE TABLE et de:  Modifier la STRUCTURE (et non le contenu) des TABLES avec ALTER TABLE  Supprimer une table avec DROP TABLE. Le LMD est le langage de manipulation de données. Parfois on inclut le LID (langage d'interrogation de données) dans cette partie. Il permet de modifier le CONTENU d'une table en  Ajoutant de nouvelles lignes INSERT INTO nom_table  Modifiant une ou plusieurs lignes UPDATE nom_table SET  Supprimant des lignes DELETE FROM nom_table Chapitre 2: SQL : LDD, LMD et contraintes
  • 25. Langage de Définition de Données ( LDD) • Syntaxe simple : CREATE TABLE nom_table ( nom_col_1 type_col_1, nom_col_2 type_col_2, … nom_col_n type_col_n ); Création d'une table : CREATE TABLE Les principaux types autorisés sont : Char(n) Chaîne de caractè. de long fixe = n Varchar2(n)/ Varchar(n) Chaîne de caractè. longueur variable Varchar )  2000 Octet (standart ANSI) Varchar2  4000 Octet ( Oracle) Number Entier ou réel  Number (p) Entier (d’au plus p chiffres) Number(p,d) Décimal sur p positions en tout (séparateur décimal compris), dont d chiffres décimaux Date le format dépend de la configuration d'Oracle. Le plus souvent c'est jj/mm/aaaa Long Chaîne longue ; restriction : par table, pas plus d’une colonne de type long
  • 26. Exemple1 : CREATE TABLE employe ( empno number(8) not null, nom varchar2(20), Fonction varchar2(10), Sal number(8,2), code_service char(3), date_embauche date ) ; Les autres propriétés possibles ( quelques Contraintes d’intégrité fonctionnelles NOT NULL : Indique qu'on est obligé de mettre une valeur dans la colonne UNIQUE : Indique que les valeurs dans la colonne doivent être toutes différentes (comme pour les clés, sauf que ce n'est pas une clé) DEFAULT : Permet d'indiquer une valeur par défaut à la création d'une nouvelle ligne Exemple 2 CREATE TABLE compte ( num_cpte NUMBER(11) NOT NULL, type_cpt VARCHAR2(8) DEFAULT ‘chèque’, solde NUMBER(10, 2) DEFAULT 0 );
  • 27. Ajouter /Supprimer une ou plusieurs colonne ALTER TABLE nom_table ADD (nom_colonne1 type_colonne1, nom_colonne2 type_colonne, …. ); ALTER TABLE nom_table drop(nom_colonne1 , nom_colonne2, …); Exemple: ALTER TABLE service ADD (budget number(6), sous_traitant varchar2(30) ) ; ALTER TABLE Album DROP (RUNK) ; La modification d'une table : ALTER TABLE  Modifier le type ou tout autre propriété d'une colonne ALTER table nom_table Rename COLUMN nom_colonne to New nom_colonne ALTER TABLE nom_table MODIFY (nom_colonne nouveau_type_et/ou_nouvelle_propriété); Exemples: 1) ALTER TABLE employe MODIFY (sal number(10,2), fonction varchar2(30) ) ;
  • 28. Renommer et supprimer une table  Supprimer une table DROP TABLE nom_table;  Exemple : DROP table employe ;  Renommer une table: • RENAME TABLE nom_table TO nouveau_nom_table;  Exemple : RENAME TABLE employe to salarie ;
  • 29. Le LDD Avancée  Les contraintes d'intégrité Une contrainte d'intégrité est une règle qui permet d'assurer la validité (cohérence) des données stockées dans une base. Le SGBD contrôle les contraintes d'intégrité à chaque modification dans les tables (saisies, modification ou suppression). Les différentes contraintes que l'on peut définir sont :  non nullité (obligation) : NOT NULL : La colonne ne peut pas contenir de valeurs NULL.  unicité : UNIQUE Toutes les valeurs de la (des) colonnes doivent être différentes ou NULL  clé primaire : PRIMARY KEY : primary key = unique + not null valeur par défaut : DEFAULT Permet de spécifier une valeur par défaut à la colonne (dans le cas où aucune valeur n'est explicitement donnée)  intégrité de domaine : CHECK Permet de spécifier les valeurs acceptables pour une colonne. intégrité référentielle (clé étrangère) : FOREIGN KEY Cette colonne fait référence à Attention, on ne met pas de virgule entre la définition de la colonne et celle de la contrainte.
  • 30.  Les contraintes d'intégrité • Cette contrainte permet de rendre obligatoire la saisie d'une colonne.  Exemple : CREATE TABLE PERSONNE ( NomPers Varchar2(30) NOT NULL, PrénomPers Varchar2(30) ); D’après cette contrainte on aura : • INSERT INTO PERSONNE VALUES ('Dupont', 'Jean'); autorisé • INSERT INTO PERSONNE VALUES ('Martin', NULL); autorisé • INSERT INTO PERSONNE VALUES (NULL, 'toto'); refusé • INSERT INTO PERSONNE(PrénomPers) VALUES ('titi'); refusé Question : • INSERT INTO PERSONNE(NomPers) VALUES (‘Harish'); refusé/ autorisé ? 1- Contrainte d'obligation : NOT NULL car il faut obligatoirement que le nom ait une valeur.
  • 31.  Les contraintes d'intégrité Sur une seule colonne CREATE TABLE PERSONNE (… Téléphone CHAR(10) UNIQUE ); Sur plusieurs colonnes : CREATE TABLE PERSONNE ( NomPers Varchar2(30) NOT NULL, PrénomPers Varchar2(30), UNIQUE (NomPers, PrénomPers) ); Une telle contrainte indique qu'on ne pourra pas avoir deux personnes ayant le même nom et le même prénom. 2 Contrainte d'unicité : UNIQUE Cette contrainte permet de contrôler que chaque ligne a une valeur unique pour la colonne ou l'ensemble de colonne unique (pas de doublons)
  • 32. CREATE TABLE PERSONN (NomPers Varchar2(30) PRIMARY KEY, PrénomPers Varchar2(30) PRIMARY KEY, …); CREATE TABLE PERSONNE (NomPers Varchar2(30), PrénomPers Varchar2(30), PRIMARY KEY (NomPers, PrénomPe rs) );  Les contraintes d'intégrité 3-Contrainte de clé primaire: La contrainte de clé primaire permet d'indiquer que la ou les colonnes sont uniques et ne peuvent pas avoir de valeur nulle. 1er cas : Si la table possède une clé composée d'une seule colonne, alors il est possible de l'indiquer juste après la colonne clé. CREATE TABLE PERSONNE ( idPers number(20) PRIMARY KEY, noms varchar(10) … ); 2em cas : Si la table a une clé compose de plusieurs colonnes, alors il est impossible d'indiquer  PRIMARY KEY au niveau des colonnes.
  • 33. Ainsi, si on insère la personne toto de la manière suivante : INSERT INTO PERSONNE (idPers, NomPers) VALUES (100, 'toto'); Alors les valeurs de ses champs seront :  Les contraintes d'intégrité 4-Contrainte Valeur par défaut : DEFAULT CREATE TABLE PERSONNE (idPers PRIMARY KEY, NomPers Varchar2(30) NOT NULL, PrénomPers Varchar2(30) DEFAULT 'prénom inconnu', DateNaiss Date DEFAULT CURRENT DATE); 100, 'toto', 'prénom inconnu', ‘02/10/2023'
  • 34.  Syntaxe : après le mot clé CHECK, on indique entre parenthèses le critère à vérifier. 5-Contrainte de domaine : CHECK La définition des types de données pour chaque colonne définit déjà un domaine pour les valeurs. On peut encore restreindre les domaines grâce à la clause CHECK. Attention  cette contrainte est très "coûteuse" en terme du temps, car elle est basé sur une comparaison pouvant contenir une requête de type SELECT. Pour valider la contrainte, le prédicat doit être évalué à TRUE ou UNKNOWN (présence de NULL  Les contraintes d'intégrité  Exemple: CREATE TABLE personne ( idpers Number PRIMARY KEY, NomPers Varchar2(30) NOT NULL, PrenomPers Varchar2(30) DEFAULT 'prénom inconnu', age Number CHECK (age >= 0 AND age < 18), etat_civil Varchar2(20) CHECK (etat_civil IN ('marié(e)', célibataire', 'veuf(ve)', 'divorcé(e)') );
  • 35.  Les contraintes d'intégrité Il est possible de donner un nom à chaque contrainte (sinon le système en donne un par défaut). Il suffit de faire précéder la contrainte par le mot-clé CONSTRAINT suivi de son nom. 6 Exemple récapitulatif CREATE TABLE PERSONNE ( idpers Number CONSTRAINT clé_primaire PRIMARY KEY, nom Varchar2(30) CONSTRAINT nom_existant NOT NULL, prenom Varchar2(30) CONSTRAINT prénom_par_défaut DEFAULT 'prénom inconnu', age Number CONSTRAINT verify_age CHECK (age >= 0 AND age < 130), etat_civil Varchar2(20) CONSTRAINT domaine_état_civil CHECK (etat_civil IN ('marié(e)', célibataire', 'veuf(ve)', 'divorcé(e)') );
  • 36.  Les contraintes d'intégrité 5- Intégrité référentielle : 5-1 : REFERENCES L'intégrité référentielle permet de vérifier la cohérence des liens entre tables, lors de l'ajout, de la suppression et de la modification de lignes. Elle est utilisée lorsqu'on a une clé étrangère. Elle permet d'assurer que toute valeur de clé étrangère correspond bien à une valeur de clé primaire de la table liée. Voyons tout d'abord la syntaxe avec un exemple: Soit le modèle relationnel suivant : CLIENT (id_client, Nom_client, …) FACTURE (code_fact, #id_client, …) Voilà comment on le traduit en SQL : CREATE TABLE FACTURE ( code_fact Number PRIMARY KEY, id_client Number REFERENCES CLIENT(id_client) … ); CREATE TABLE CLIENT ( id_client Number PRIMARY KEY, Nom_client Varchar2(30) NOT NULL, …
  • 37. 5- Intégrité référentielle : 5-2 Intégrité référentielle : Conséquences L'application de l'intégrité référentielle implique plusieurs choses :  On ne peut pas ajouter une facture avec un id_client qui n'existe pas dans la table client (sinon un message d'erreur apparaît). Il faut d'abord créer le client avant de créer sa facture.  On ne peut pas supprimer un client s'il existe des factures qui lui correspondent. Il faut d'abord supprimer toutes les factures qui le concernent avant de pouvoir le supprimer  On ne peut pas modifier l'id_client dans la table client s'il existe des factures qui le concernent.  On peut modifier l'id_client de facture seulement si on choisit un id_client qui existe dans la table client. Cela revient à vérifier que toutes les factures correspondent toujours à un client qui existe
  • 38. 5- Intégrité référentielle : 5-2 Options Options des contraintes d'intégrité référentielles Effacer en cascade ON DELETE CASCADES. Si on ajoute cette option à la contrainte d'intégrité référentielle, alors si on supprime une ligne de client, toutes les factures de ce client seront supprimées. Attention : cette contrainte s'applique à la table facture ('enfant') mais elle est vérifiée lorsqu'on modifie la table client ('parent') CREATE TABLE FACTURE ( code_fact Number PRIMARY KEY, id_client Number REFERENCES CLIENT(id_client) ON DELETE CASCADE … );
  • 39. 5- Intégrité référentielle : 5-3 Références à des colonnes multiples CREATE TABLE RESERVATION ( id_resa Number PRIMARYKEY, id_hotel Number, num_ch Number, date Date NOT NULL, FOREIGN KEY (id_hotel, num_ch) REFERENCES CHAMBRE (id_hotel, num_ch) ); Il arrive qu'une clé primaire, composée de plusieurs colonnes, soit elle-même clé étrangère d'une autre table. On indique alors cette clé étrangère composée après la définition des colonnes, grâce au mot clé FOREIGN KEY suivi des colonnes clés étrangères, puis de REFERENCES, le nom de la table référencée ainsi que le nom des colonnes référencées entre parenthèses. Exemple : soit le schéma relationnel suivant CHAMBRE(id_hotel, num_ch, tarif) RESERVATION(id_resa, #id_hotel, #num_ch, date)
  • 40. CREATE TABLE LIGNE_COMMANDE ( id_commande Number REFERENCES COMMANDE(id_commande), ref_produit Varchar2(10) REFERENCES PRODUIT(ref_prod), quantité Number DEFAULT 1, PRIMARY KEY (id_commande, ref_produit) ); 5- Intégrité référentielle : 5-4 La clé primaire est composée de plusieurs clés étrangères Remarque : dans la table PRODUIT, la référence est codée par ref_prod et dans la table COMMANDE, c'est ref_produit
  • 41.  Ajout/ modification ou suppression d'une contrainte Exemple 2 : On ajoute la contrainte de vérification de l'âge d'une personne: Sql> ALTER TABLE PERSONNE ADD CONSTAINT verif_age CHECK (age <= 130); Exemple1 : On ajoute la contrainte d'intégrité référentielle dans la table COMMANDE. Sql> ALTER TABLE COMMANDE ADD CONSTAINT FK_idclient FOREIGN KEY (id_client) REFERENCES CLIENT(id_client); Syntaxe générale : ALTER TABLE nom_table ADD CONSTRAINT Nom_Constraint TYPE_CONTRAINTE (colonne(s)); ALTER TABLE nom_table DROP CONSTRAINT <Nom_constaint>; Pour ajouter/supprimer ou modifier une contrainte à une table existante, il suffit d'utiliser la commande:  ALTER TABLE Exemple 3 : Supprimer la contrainte de vérification de l'âge d'une personne: Sql> ALTER TABLE PERSONNE Drop CONSTAINT verif_age); alter table nom_table modify (col default ‘Val_par_defau);  ALTER TABLE cas particulier : la proprité « par defautlt » n’est pas une contraite oracle :
  • 42. Exercices d’application(TD/TP 1) Soit le schéma logique suivant 1- Créer les tables en respectant le type de donnée de chaque attribut. La création va se faire comme suite: - 1er Créer la table STYLES en déclarant la Clés primaire en même temps -2ém Créer la table ARTIST en déclarant la Clés primaire en même temps -3ém Créer la table ALBUM sans mentionner les clés -4ém Créer la table STYLE sans mentionner les clés 2- En utilisant les contraintes, déclarer les clés primaires et étrangères pour les deux tables : ALBUM et STYLE P= clé primaire F= Clé étrangère FP= les deux clés
  • 43. 3- Ajouter une colonne Role de type quelconque à la table STYLE 4- Ajouter une contrainte à la colonne PRICE de la table ALBUM ( PRICE> 30) 5. Affecter la valeur 0 à tous les RANK de tous les ALBUM existants 6. Modifier la colonne RANK de la table Album pour qu'elle prenne la valeur 0 par défaut 7- Supprimer la colonne Role de la table STYLE 8. Ajouter: - un nouveau STYLES - un nouveau ARTIST - un nouveau ALBUM - un nouveau STYLE 9. Donner les albums dont le prix est inférieur à 9 euros. 10. Donner les albums qui sont sortis après le 18 mai 1999. 11. Donner les artistes dont l’album a atteint un rank supérieur ou égal à 25000. 8. Changer le rang de l’artiste « BOB » à 30 Exercices d’application (Suite)
  • 44. CREATE TABLE ALBUM ( ASIN INT (38) NOT NULL , TITLE VARCHAR (30) NOT NULL , IDARTIST INT (38) NOT NULL , PRICE number(10) , `RELEASE` DATE, RANK number (28) , IDLABEL number (38) NOT NULL ); CREATE TABLE ARTIST ( ID Number (38) NOT NULL , NOM VARCHAR (30) NOT NULL ); ALTER TABLE ALBUM ADD CONSTRAINT PK_ALBUM PRIMARY KEY (ASIN); ALTER TABLE ALBUM ADD CONSTRAINT FK_ALBUM_ARTIST Foreign Key (IDARTIST) REFERENCES ARTIST (ID); ALTER TABLE ALBUM ADD CONSTRAINT FK_ALBUM_LABEL Foreign Key (IDLABEL) REFERENCES LABEL (ID); ALTER TABLE ARTIST ADD CONSTRAINT PK_ARTIST PRIMARY KEY (ID); Exercices d’application (Creation des tables))
  • 45. ALTER TABLE STYLE ADD CONSTRAINT PK_STYLE PRIMARY KEY (ASIN); ALTER TABLE STYLE ADD CONSTRAINT FK_STYLE_ALBUM Foreign Key (ASIN)REFERENCES ALBUM (ASIN); ALTER TABLE STYLE ADD CONSTRAINT FK_STYLE_STYLES Foreign Key (STYLE) REFERENCES STYLES (STYLE); CREATE TABLE STYLES ( STYLE VARCHAR (24) NOT NULL ); ALTER TABLE STYLES ADD CONSTRAINT PK_STYLES PRIMARY KEY (STYLE); CREATE TABLE STYLE ( ASIN INT (38) NOT NULL , STYLE VARCHAR (24) NOT NULL ); Exercices d’application (Création des tables suite …)
  • 46. • Requêtes imbriquées • Agrégat • Regroupement • La gestion des Vues et des Index, des synonymes et des Séquences • La Gestion de transactions Chapitre 3 : Requêtes Complexes
  • 47. Motivation • Les requêtes déjà vues ne correspondent qu’à des opérations simples • Vers le PL/SQL • Requête imbriquée  Parfois la valeur d’un test doit être calculé comme le résultat d’une autre requête • Agrégat  Opération destinée à agréger plusieurs valeurs de tuples en une seule valeur (en les additionnant, en calculant leur moyenne, etc.) • Regroupement  Décomposition d’une table en plusieurs sous-tables sur lesquels des opérations seront effectuées sous-table par sous-table (des agrégats par exemple)
  • 49. SQL : Requêtes imbriquées • Requête imbriquée dans la clause WHERE d'une requête externe: • Opérations ensemblistes  Le résultat d’une requête (imbriquée) est une table, c’est-à-dire un ensemble de tuples.  Les opérations possibles sont donc ensemblistes. SELECT … FROM … WHERE [Expression] Opérateur (SELECT … FROM … WHERE …); Requête imbriquée Requête externe 4
  • 50. Opérateurs ensemblistes • IN  appartenance ensembliste  (A1,…An) IN <sous-req> • EXISTS  test d’existence  EXISTS <sous-req> • COMPARAISON  comparaison avec chaque élément d’un ensemble  (A1,…An) ALL <sous-req>  opérateur 5 de comparaison (<,>,<=,>=,<>)
  • 51. Expression IN 5 • Sémantique :  la condition est vraie si tuple désigné par (A1,…, appartient au résultat de la requête interne. • Algorithme An)de la requête externe  Pour chaque tuple des tables de la requête externe, extraire et calculez le sous-tuple (A1,…An)  Si le tuple obtenu appartient au résultat de la requête imbriquée, calculezet ou afficher les expressions de projection de la clause SELECT. SELECT … FROM … WHERE (A1,…,An)IN (SELECT B1,…,Bn FROM … WHERE …);
  • 52. Expression NOT IN 5 • Sémantique :  la condition est vraie si tuple désigné par (A1,…, An)de la requête externe n’appartient pas au résultat de la requête interne. • Algorithme  Pour chaque tuple des tables de la requête externe, extraire et calculez le sous-tuple (A1,…An)  Si le tuple obtenu n’appartient pas au résultat de la requête imbriquée, calculer et/ou afficher les expressions de projection de la clause SELECT. SELECT … FROM … WHERE (A1,…,An)NOT IN (SELECT B1,…,Bn FROM … WHERE …);
  • 53. Exemple avec IN 53 • Noms des employés qui travaillent dans des villes où il y a des projets de budget inférieur à 50? SELECT Ename FROM WHERE Emp City IN (SELECT City FROM Project WHERE Budget < 50); Emp (Eno, Ename, Title, City) Pay(Title, Salary) Project(Pno, Pname, Budget, City) Works(Eno, Pno, Resp, Dur) • Noms des employés qui travaillent dans des villes où il n’y a pas de projets de budget inférieur à 50? SELECT Ename FROM Emp WHERE City NOT IN (SELECT City FROM Project WHERE Budget < 50);
  • 54. ALL • est une comparaison : • Sémantique {<, <=, >, >=, <>}  ALL ( ) : la condition est alors vraie si la comparaison est vraie pour tous les tuples résultats de la requête interne. • Algorithme  Pour chaque tuple des tables de la requête externe, extraire et calculez le sous-tuple (A1,…An)  Si la comparaison de (A1,..,An) est vraie avec tous les tuples de la requête imbriquée, alors calculer et/ou aficher les expressions de projection de la clause SELECT. SELECT … FROM … WHERE (A1,…,An) ALL (SELECT B1,…,Bn FROM … WHERE …); 54
  • 55. Exemple avec ALL • Noms des projets qui ont le plus gros budget ? SELECT DISTINCT Pname FROM Project WHERE Budget >= ALL (SELECT Budget FROM Project) Emp (Eno, Ename, Title, City) Pay(Title, Salary) Project(Pno, Pname, Budget, City) Works(Eno, Pno, Resp, Dur) 5
  • 56. ANY • est une comparaison : • Sémantique {<, <=, >, >=, <>}  ANY: la condition est alors vraie si la comparaison est vraie avec au moins un tuple résultats de la requête interne. • Algorithme  Pour chaque tuple des tables de la requête externe, extraire et calculez le sous-tuple (A1,…An)  Si la comparaison de (A1,..,An) est vraie avec au moins un tuple de la requête imbriquée, alors calculer et/ou afficher les expressions de projection de la clause SELECT. SELECT … FROM … WHERE (A1,…,An) ANY (SELECT B1,…,Bn FROM … WHERE …); 56
  • 57. Exemple avec ANY 5 • Noms des villes qui ont au moins un projet de budget supérieur à 50000 ? SELECT DISTINCT City FROM Project WHERE Budget = ANY (SELECT Budget FROM Project WHERE Budget > 50000) Emp (Eno, Ename, Title, City) Pay(Title, Salary) Project(Pno, Pname, Budget, City) Works(Eno, Pno, Resp, Dur)
  • 58. EXISTS • EXISTS retourne VRAI ou FAUX • Sémantique : – La condition EXISTS est vraie si la requête imbriquée n’est pas vide. • Algorithme  Pour chaque tuple des tables de la requête externe, extraire et calculez le sous-tuple (A1,…An)  Si le résultat de la requête imbriquée n’est pas vide, alors calculer et/ou aficher les expressions de projection de la clause SELECT. SELECT … FROM R1 ,X, … WHERE EXISTS (SELECT B1,…,Bn FROM … WHERE Condition(x) …); Les deux requêtes 5 sont généralement corrélées, la requête imbriquée dépend de la valeur de x.
  • 59. Exemple avec EXISTS • Noms des employés qui travaillent dans une ville où il y a au moins un projet? SELECT FROM WHERE e.Ename Emp e EXISTS (SELECT FROM * Project WHERE e.City=Project.City) • Noms des projets qui emploient des ‘Elect Eng’ ? Emp (Eno, Ename, Title, City) Pay(Title, Salary) Project(Pno, Pname, Budget, City) Works(Eno, Pno, Resp, Dur) 5 SELECT FROM WHERE p.Pname Project p EXISTS(SELECT * FROM Works w, Emp e WHERE w.Pno=p.Pno and e.Eno=w.Eno and e.Title=’Elect.Eng.’)
  • 60. Exemple avec EXISTS La requête imbriquée ne dépend pas de p : elle retourne l’ensemble des employés de titre ‘Elect. Eng.’, indépendamment du projet sélectionné dans la requête externe. La clause EXISTS retourne donc toujours vraie (on suppose qu’il existe un tel employé) et la requête externe retourne tous les noms de projets. Emp (Eno, Ename, Title, City) Pay(Title, Salary) Project(Pno, Pname, Budget, City) Works(Eno, Pno, Resp, Dur) 6 SELECT p.Pname FROM Project p WHERE EXISTS (SELECT * FROM Works w, Emp e WHERE e.Eno=w.Eno Ande.Title=’Elect.Eng.’)
  • 61. NOT EXISTS • NOT EXISTS retourne VRAI ou FAUX • Sémantique : – La condition NOT EXISTS est vraie si la requête imbriquée est vide. • Algorithme • Pour chaque tuple des tables de la requête externe, extraire et calculez le sous-tuple (A1,…An) • Si le résultat de la requête imbriquée est vide, alors calculer et/ou aficher les expressions de projection de la clause SELECT. SELECT … FROM R1 x… WHERE NOT EXISTS (SELECT B1,…,Bn FROM … WHERE Condition(x)); Les deux requêtes 6 sont généralement corrélées, la requête imbriquée dépend de la valeur de x.
  • 62. Exemple avec NOT EXISTS 6 • Noms des projets qui n’emploient aucun ‘Elect Eng’ ? SELECT FROM WHERE p.Pname Project p NOT EXISTS (SELECT * FROM Works w, Emp e WHERE w.Pno=p.Pno and e.Eno=w.Eno and e.Title=’Elect.Eng.’); Emp (Eno, Ename, Title, City) Pay(Title, Salary) Project(Pno, Pname, Budget, City) Works(Eno, Pno, Resp, Dur)
  • 64. Fonctions d'agrégation • Une fonction d’agrégation permet de calculer une seule valeur numérique à partir des valeurs de plusieurs tuples pour un attribut donné  Exemple: la somme des budgets des projets • Une fonction d’agrégation prend un attribut en paramètre • On utilise une fonction d’agrégation  dans la clause SELECT pour effectuer un calcul post-projection  dans la clause WHERE pour remplacer une valeur par un calcul dans une condition. Ce calcul est le résultat de l’agrégation d’une requête imbriquée. SELECT FROM WHERE 6 AggFunc(Ai), …, AggFunc(Aj) R1, ..., Rm conditions;
  • 65. Fonctions d’agrégation 6 Fonction Description COUNT([DISTINCT]x,y,…) Décompte des tuples du résultat par projection sur le ou les attributs spécifiés (ou tous avec ‘*’). L’option DISTINCT élimine les doublons. MIN(x), MAX(x), AVG(x), SUM(x) Calculent respectivement le minimum, le maximum, la moyenne et la somme des valeurs de l’attribut X.
  • 66. Exécution d’une requête d’agrégation 6 1. La requête est exécutée classiquement et retourne une table résultat temporaire dont les colonnes sont les attributs Ai, …, Aj utilisées dans les fonctions d’agrégation 2. Les fonctions d’agrégation sont appliquées sur les colonnes de la table résultat 3. Le résultat de la requête est une table  dont les colonnes sont les noms des expressions de la clause SELECT  contenant un seul tuple
  • 67. Requête d’agrégation Personnes SELECT sum(salaire) FROM Personnes Sum(salaire) 9700 Etape 1) Table-Temp = SELECT salaire FROM Personnes T able-T emp Etape 2) Table-Resultat = SELECT sum(salaire) FROM Table-Temp agrégation T able-Resultat 67 nom prénom salaire Martin Pierre 2500 Dupond Jean 3000 Dupond Marc 4200 salaire 2500 3000 4200
  • 68. Exemples d'agrégation dans la clause SELECT 6 • Budget max des projets de Paris? SELECT FROM WHERE MAX(Budget) Project City = ’Paris’; • Affichage du nombre d’employés SELECT COUNT(*) FROM Emp; Emp (Eno, Ename, Title, City) Project(Pno, Pname, Budget, City) Pay(Title, Salary) Works(Eno, Pno, Resp, Dur) • Nombre de villes où il y a un projet avec l'employé E4? SELECT FROM WHERE AND COUNT(DISTINCT City) Project, Works Project.Pno = Works.Pno Works.Eno = ’E4’;
  • 69. Exemple d'agrégation dans la clause WHERE 6 Emp (Eno, Ename, Title, City) Project(Pno, Pname, Budget, City) Pay(Title, Salary) Works(Eno, Pno, Resp, Dur) • Noms des projets dont le budget est supérieur au budget moyen? SELECT Pname FROM Project WHERE Budget > (SELECT AVG(Budget) FROM Project);
  • 70. Exemples d'agrégation • Budget max des projets de Paris avec identifiant ? SELECT Pno, MAX(Budget) FROM Project WHERE City = ’Paris’; • Budget max des projets de Paris avec identifiant ? Emp (Eno, Ename, Title, City) Pay(Title, Salary) Project(Pno, Pname, Budget, City) Works(Eno, Pno, Resp, Dur) Impossible de mélanger une fonction d’agrégation avec un attribut sans agrégation s’il n’y a pas de clause GROUP BY ! 7 SELECT Pno, Budget FROM Project WHERE City = ’Paris’ AND Budget = (SELECT MAX(Budget) FROM Project and City=‘Paris’);
  • 72. Requêtes de groupement : GROUP BY • Sémantique  Partitionne les tuples résultats en fonction des valeurs de certains attributs • Algorithme 1. Calcul de la requête brute (sans regroupement ni agrégation) 2. Regroupement horizontal des lignes en sous-tables possédant les mêmes valeurs de regroupement Aj …, Ak 3. Pour chaque sous-table, calcul des valeurs agrégées pour les attributs non regroupés SELECT FROM WHERE GROUP 7 A1, …, An, R1, …, Rm … BY A1 …, An AggFunc(An+1), …, AggFunc(An+p)
  • 73. GROUP BY SELECT A1, B1, sum(A2) FROM R1, R2 WHERE A1 < 3 GROUP BY A1, B1 R1 7 R2 B1 a group by where select A1A2 2 6 1 1 2 8 3 3 1 2 3 3 A1 A2 B1 2 6 a 1 1 a 2 8 a 1 2 a A1 A2 B1 2 6 a 1 1 a 2 8 a 3 3 a 1 2 a 3 3 a A1 B1 sum(A2) 1 a 3 2 a 14 A1 B1 A2* 1 a 1 2 2 a 6 8 from
  • 74. GROUP BY 7 • Règles de regroupement  Tous les attributs Ai, …, An dans la clause SELECT qui ne sont pas impliqués dans la clause GROUP BY doivent être inclus dans une opération d'agrégation • SELECT Pno, count(Eno) FROM Works GROUP BY Pno; • Sélection des tuples  La clause WHERE permet de sélectionner les tuples appartenant aux sous- tables. La condition est évaluée AVANT le regroupement. • SELECT Pno, count(Eno) FROM Works WHERE Dur >10 GROUP BY Pno;
  • 75. Exemples de groupement • Numéros des projets avec le nombre d’employés impliqués par projet ? SELECT Pno, Count(Eno) FROM Works GROUP BY Pno; • Noms des villes avec la durée moyenne et la durée maximale de participation de tout les employé par ville et par nom de projet ? Emp (Eno, Ename, Title, City) Pay(Title, Salary) Project(Pno, Pname, Budget, City) Works(Eno, Pno, Resp, Dur) 7 SELECT FROM WHERE Pname, AVG(Dur), MAX(Dur) Works, Project Works.Pno=Project.Pno GROUP BY City, Pname;
  • 76. Exemple de groupement ordonné Classement des produits par la valeur totale vendue pour les produits SELECT DISTINCT produit.nom, SUM(vente.qt * AS total FROM produit, vente produit.prix) WHERE GROUP ORDER produit.id = vente.produit_idx BY produit.nom BY total; Le tri des résultats se fait APRES le regroupement et l’agrégation. 7
  • 77. Sélection sur des groupes GROUP BY Aj …, Ak HAVING condition • Sémantique  Sélectionne les groupes (partitions) qui satisfont une certaine condition . • Algorithme 1. Sélectionne tous les tuples qui satisfont les conditions de la clause WHERE. 2. Forme les groupes qui partagent les mêmes valeurs de la clause GROUP BY. 3. Supprime tous les groupes qui ne satisfont pas les conditions de la clause HAVING 4. Applique les fonctions d’agrégation pour chaque groupe. 5. Retourne les valeurs des colonnes et des agrégation de la clause SELECT. 7 SELECT FROM WHERE Ai, …, An, R1, …, Rm … [AggFunc(Ai), …, AggFunc(Aj), …]
  • 78. Sélection sur des groupes 7 • Règle : La condition de la clause HAVING porte  Soit sur des valeurs atomiques retournées par un opérateur d'agrégation sur les attributs qui n’apparaissent pas dans le GROUP BY  Soit sur des opérations d’agrégation sur des attributs qui apparaissent dans le GROUP BY • Exemple SELECT DISTINCT produit.nom, SUM(vente.qt*produit.prix) AS "total produit", vente, produit produit.id = vente.produit_idx and nom like’a%’ BY produit.nom FROM WHERE GROUP HAVING MIN(vente.qt)>1;
  • 79. Exemples de groupement avec sélection 7 • Villes dans lesquelles habitent plus de 2 employés? SELECT City FROM Emp GROUP BY City HAVING COUNT(ENO) > 2; • Projets dans lesquels 2 employés ou plus partagent une responsabilité? Emp (Eno, Ename, Title, City) Pay(Title, Salary) Project(Pno, Pname, Budget, City) Works(Eno, Pno, Resp, Dur) SELECT DISTINCT Pno FROM Works where resp=‘Oui’ GROUP BY Pno, Resp HAVING COUNT(DISTINCT ENO) >=2;
  • 80. Exemples de groupement avec sélection 8 SELECT DISTINCT model FROM voiture SELECT DISTINCT produit.nom, SUM(vente.qt * produit.prix) AS total FROM produit, vente WHERE produit.id=vente.produit_idx And produit.nom like ’M%’ GROUP BY produit.nom , produit_idx ORDER BY total; Classement des produits par la valeur totale vendue pour les produits commençant par la lettre ‘M’. Produit( id, nom, prix,…) vente( id_vente, produit_idx*, qt, …,…) Afficher Les modèles de voitures qui proposent un choix de plus de 10 couleurs. Voiture ( id_voiture, model, couleur,…) GROUP BY model HAVING COUNT(couleur) > 10; Est-ce Correcte ?!
  • 81. 8  Langage SQL avancé : 1- Les ordre SQL complexe ( agrégat , requête imbriquées, et la clause having) 2- Les Vues et Index, 3- Les Séquences et Les synonymes 4- La Gestion de transactions Chapitre 3(Suite)
  • 82. Les Vues (VIEW) 8  une vue est une table virtuelle résultat d’une requête  Rôle d’une vue  Réduire la complexité syntaxique des requêtes  Améliorer les performances de certains traitements  Définir les schémas externes.  Définir des contraintes d’intégrité.  Définir un niveau additionnel de sécurité en restreignant l’accès à un sous ensemble de lignes et/ ou de colonnes. Les vues font partie du Schéma externe, schéma visible par les applications utilisant la base de données.
  • 83. 83 La requête SQL peut s'appliquer à une table ou une vue (exception faite de la vue que l'on est en train de définir, i.e. on ne peut pas créer une définition récursive). La définition de la vue est stockée dans le dictionnaire ce qui permet de traduire toute requête utilisant des vues en une requête sur les tables. Une vue permet de donner un nom à une requête. La syntaxe SQL de création d'une vue est simplement create [or replace] view nom_vue as requete_sql [option]
  • 84. • On crée les vues suivantes Nom_Emp et som_sal 1- Nom_Emp: Create view Nom_Emp as select * from EMPLOYEES where last_name like ‘ J%’ 2- som_sal : create or replace view SOM_SAL as select J.job_title J_titl, sum(E.SALARY) somme_sal from employees E,jobs J where E.job_id=J.job_id group by job_title • Soit les tables suivante de Schéma HR de oracle EMPLOYEES(EMPLOYEE_ID , FIRST_NAME , LAST_NAME ,EMAIL,PHONE_NUMBER ,HIRE_DATE ,JOB_ID,SALARY, COMMISSION_PCT, MANAGER_ID,DEPARTMENT_ID) JOBS(JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY)
  • 85. • Modification au travers d'une vue Les instructions de mise à jour de la vue doivent être traduites en mise à jour sur les tables de base. Ceci n'est pas possible dans le cas général. Pour cette MAJ Il faut que : 1- Chaque colonne de la vue doit correspondre à une colonne d'une table. 2- La vue ne doit pas contenir : un opérateur ensembliste un opérateur DISTINCT une fonction de groupe, ou une fonction mathématique une clause GROUP BY, ORDER BY des jointures (avec quelques exceptions ( notion de clé préservée dans la vue) ) On peut interdire de modifier une vue, avec l'option WITH READ ONLY. (Sous Oracle, mais je n'ai pas vu cette option dans la norme SQL). 8
  • 86. 8 La clause WITH CHECK OPTION Cette option (définie dans la norme SQL) permet de vérifier que lorsqu'on modifie une vue, les lignes concernées par la modification sont bien sélectionnées par la requête qui définit la vue. Sans cette option, voici le genre de problèmes que l'on peut avoir : - Create view Nom_Emp as select * from EMPLOYEES where last_name like ‘ JOHN’ Vue bien crée - insert into Nom_Emp values(6666,'TATA','TINTIN','TINGBB','777','17/06/15','AD_PRES’,'24000',NULL,NUL L,'90'); Ligne bien crée Attention on se retrouve dan la vue avec des données non souhaitées -Update et delete aussi vont être bien exécutés sur la vue.
  • 87. 8 La clause WITH CHECK OPTION permet d'éviter les problèmes précédents - Create view Nom_Emp as select * from EMPLOYEES where last_name like ‘ JOHN’ with check option Vue bien crée insert into Nom_Emp values(6666,'TATA','TINTIN','TINGBB','777','1 7/06/15','AD_PRES’,'24000',NULL,NULL,'90'); ERREUR à la ligne 1: ORA-01402: vue WITH CHECK OPTION - violation de clause WHERE Pour renommer une vue : Rename ancien_nom to nouveau_nom;
  • 88. Rappels sur les indexes : Principes choix et création : index btree , BitMap
  • 89. L’index est utile pour accélérer l’exécution d’une requête SQL qui lit des données et ainsi améliorer les performances d’une application utilisant une base de données Les 2 types d’index les plus utilisé dans Oracle : Arbres équilibrés (B-arbre) : toutes les branches de l’arbre ont la même longueur Il est efficace lorsque les données indexés ne sont pas répétés ( Clé primaire , données uniques)  Bitmap : Si peu de valeurs sont possibles pour les données répétées, une chaine de bits pour chaque valeur Un index est un objet complémentaire (mais non indispensable) à la base de données permettant d'"indexer" certaines colonnes dans le but d'améliorer l'accès aux données par le SGBDR, au même titre qu'un index dans un livre ne vous est pas indispensable mais vous permet souvent d'économiser du temps lorsque vous recherchez une partie spécifique Qu'est-ce qu'un index?
  • 90. De manière générale, un index est créé automatiquement lors de la création de la clé primaire d'une table ; de la même manière, il est d'usage d‘en créer un pour chaque clé étrangère afin d'améliorer la vitesse lors des jointures. Un index peut être :  Simplement le stockage des données d'une colonne de table qui sera souvent sollicitée (surtout au niveau des recherches)  L'ensemble de plusieurs colonnes qui feront l'objet de requête pour les recherches. Création de l’index
  • 91. • Quand créer un index -----------------------------  Attributs utilisées dans des jointures,  Attributs servant souvent pour les sélections,  Table de gros volume dont la majorité des interrogations sélectionne moins de 15% des lignes, • Quand ne pas créer un index -------------------------------  Attributs souvent modifiés (index à recréer...),  Table de petit volume,  si requêtes sur NULL car les NULL, non stockés dans l’index. (ex : WHERE ... IS NULL). Bitmap : attribut à peu de valeurs distinctes, B-arbre : attribut à beaucoup de valeurs Création de l’index
  • 92. La création d'index en SQL se fait grâce à la clause INDEX précédée de la clause CREATE. Elle permet de définir un index désigné par son nom, portant sur certains champs d'une table. La syntaxe est la suivante : CREATE [UNIQUE] [BITMAP]INDEX Nom_de_l_index ON Nom_de_la_table (Nom_de_champ [ASCDESC], ...) [Tablespace nom_tablespace_des_index] ; •L'option UNIQUE permet de définir la présence ou non de doublons pour les valeurs de la colonne •L'option BITMAP Index de type bitmap •Les options ASCDESC permettent de définir un ordre de classement des valeurs présentes dans la colonne •Supprimer l’INDEX  DROP INDEX Nom_Index
  • 93. 0-100 ----------- -- 101-200 ----------- ------- ……… …. ----------- ------ 301- 400- Branches ( Branch Blocks) 0-33 ----------- 34-67 ---------- 68-100 101-134 ----------- 135-167 ---------- 167-300 0 Rowid ----------- 1 Rowid ---------- … ------- 33 Rowid 34 Rowid ----------- 35 Rowid ---------- … ------- 67 Rowid 68 Rowid ----------- 69 Rowid ---------- … ------- 100Rowi d 101 Rowid ----------- 102Rowid ---------- … ------- 134Rowid 135Rowi d ----------- 136Rowi d ---------- … ------- 167Rowi d 168Rowi d ----------- 169Rowi d ---------- … ------- 300Rowi d Nœud racine ( Root Node) Feuilles ( Leaf Blocks) Le segment de la table Table segment
  • 95. Les valeurs inférieures sont à gauche Les valeurs Supérieures sont à droit Comment ça marche L’index B-Tree ( L’arbre Binnaire)
  • 96. Comment ça marche L’index B-Tree ( L’arbre Binnaire) La Recherche 20 10 8 6 5
  • 97. Comment ça marche L’index B-Tree ( L’arbre Binnaire) L’Insertion 20 10 11 5 11
  • 98. Comment ça marche L’index B-Tree ( L’arbre Binnaire) Suppression 20 10 5 7 8 6 7
  • 99. Comment ça marche L’index B-Tree ( L’arbre Binnaire) Suppression 2 5 2
  • 100. Comment ça marche L’index B-Tree ( L’arbre Binnaire) Suppression 20 20 30 25 22 22
  • 101. L’index Bitmap Select nom, prenom, job_id from employees ID NOM Prenom Job_id- --------------------------------------------------------------------------- 101 Neena Kochhar AD_VP 102 Lex De Haan AD_VP 103 Alexander Hunold IT_PROG 104 Bruce Ernst IT_PROG 107 Diana Lorentz IT_PROG 108 Nancy Greenberg FI_MGR 109 Daniel Faviet FI_ACCOUNT 110 John Chen FI_ACCOUNT 111 Ismael Sciarra FI_ACCOUNT 112 Jose Manuel Urman FI_ACCOUNT 113 Luis Popp FI_ACCOUNT 115 Alexander Khoo PU_CLERK 116 Shelli Baida PU_CLERK 117 Sigal Tobias PU_CLERK 118 Guy Himuro PU_CLERK 119 Karen Colmenares PU_CLERK 120 Matthew Weiss ST_MAN 121 Adam Fripp ST_MAN 122 Payam Kaufling ST_MAN 123 Shanta Vollman ST_MAN 124 Kevin Mourgos ST_MAN 125 Julia Nayer ST_CLERK 126 Irene Mikkilineni ST_CLERK 127 James Landry ST_CLERK 128 Steven Markle ST_CLERK 105 David Austin IT_PROG 106 VallPataballa IT_PROG 1 2 3 4 5 6 7 8 … ST_CLERK 0 0 0 0 0 0 0 0 . . ST_MAN 0 0 0 0 0 0 0 0 . . FI_ACCOU NT 0 0 0 0 0 0 1 1 . . PU_CLERK 0 0 0 0 0 0 0 0 . . IT_PROG 0 0 1 1 1 0 0 0 . . AD_VP 1 1 0 0 0 0 0 0 . . Select * from employees where job_id like ‘FI_ACCOUNT’ L’index Bitmap n’est pas utilisé (exploité) quand la clause est ( not like , not in , different <>, null)
  • 102. Exemple de création d’index Créer l’index : CREATE UNIQUE INDEX idx_clients ON clients(no_client) CREATE BITMAP INDEX idx_empl ON departments (department_name) Supprimer l’index  DROP index idx_empl
  • 103. • Une séquence est un objet de base de données Oracle, au même titre qu'une table, une vue, • Elle appartient à un utilisateur, on peut donc si on a les droits nécessaires :  La manipuler,  La modifier,  La supprimer  ….. Les Séquence
  • 104. Définir une séquence équivaut à définir une suite de nombres entiers. L'évolution de cette suite est régie par un certain nombre de paramètres, L'utilisation d'une séquence permet donc d'avoir à disposition une suite de valeurs. Les Séquence Définition d'une séquence
  • 105. Création D’une Séquence •  SQL> CREATE SEQUENCE ma_sequence; • La séquence a 2 Pseudo-colones • 1- La pseudo-colonne CURRVAL retourne la valeur courante de la séquence. • 2- La pseudo-colonne NEXTVAL incrémente la séquence et retourne la nouvelle valeur. L'ordre SQL minimal de création d'une séquence : SQL> select ma_sequence.nextval from dual; NEXTVAL 1 SQL> select ma_sequence.currval from dual; CURRVAL --------- 1 SQL> select ma_sequence.nextval from dual; NEXTVAL --------- 2
  • 106. Création D’une Séquence D’autre option de création d'une séquence : Valeur initiale et incrément: Les paramètres START WITH et INCREMENT BY. RQ: ces paramètres peuvent s'utiliser indépendamment. CREATE SEQUENCE ma_sequence START WITH 4 INCREMENT BY 2; Dans cet exemple, on a défini la suite 4, 6, 8, 10,12, 14, 16,…., etc Pour faire une suite descendante, il suffit d'indiquer une valeur négative au paramètre CREATE SEQUENCE ma_sequence INCREMENT BY -10; Valeur MAXI et MINI CREATE SEQUENCE ma_sequence MAXVALUE MINVALUE; CREATE SEQUENCE ma_sequence MINVALUE -20 MAXVALUE 40; CREATE SEQUENCE ma_sequence START WITH 1 INCREMENT BY 1 MAXVALUE 9999; CREATE SEQUENCE ma_sequence START WITH -1 INCREMENT BY -1 MINVALUE -9999;
  • 107. • Lorsque la séquence atteint sa valeur maxi (resp. mini), on peut lui demander de s'arrêter (Oracle retournera une erreur lors de la prochaine tentative d'utilisation de NEXTVAL), ou de reprendre à sa valeur mini (resp. maxi) et reprendre son compte. Cas N°1 : • CREATE SEQUENCE ma_sequence_NC START WITH 1 MINVALUE -10 MAXVALUE 10 NOCYCLE; Cette séquence comptera jusqu'à 10 puis retournera une erreur au NEXTVAL suivant • Cas N°2 : • CREATE SEQUENCE ma_sequence_WC START WITH 1 MINVALUE -10 MAXVALUE 10 CYCLE; • Cette séquence (ma_sequence_WC ) comptera de 1 à 10, puis de -10 à 10, puis de -10 à 10... : • Par défaut, une séquence ne reboucle pas (cas n°1) Création D’une Séquence Reboucler la séquence
  • 108. • SQL> create sequence seq_no_cli start with 1000 increment by 100; • SQL> insert into clients (no, nom) values (seq_no_cli.nextval,'Martin'); Pour Supprimer une Séquence: DROP SEQUENCE nom_de_la_sequence; Pour Réinitialiser une séquence soit par Alter ou bien un Programme PL/SQL Création D’une Séquence Exemple d’utilisation d’une la séquence
  • 109. Les synonymes • Un Synonyme: est un alias d’un objet base de données (tables, vues,indexes, synonymes, séquences, déclencheurs, procédures, fonctions…) • • Si on crée le synonyme emp sur la tables hr.employee, alors manipuler emp, revient • à manipuler hr.employee : • SELECT * FROM employee équivaut à SELECT * FROM hr.employee • Il existe deux types de synonymes : • Synonyme privé : accessible uniquement à partir du schéma dans lequel il a été créé • CREATE SYNONYM nom_syn FOR schema.nom_objet • Synonyme public : accessible à partir de tout schéma • CREATE PUBLIC SYNONYM nom_syn FOR schema.objet
  • 110. Transactions • Cohérence et Transaction : • Un SGBD doit supporter : • Plusieurs utilisateurs  utilisation en parallèle •  Lecture et écriture Mise à jours - Tout en garantissant la cohérence de la base de données • Une transaction est une suite d’instructions qui réussissent ou qui échouent en totalité (pas de réussite partielle). • Ou encore c’est ensemble des ordre SQL indivisible faisant passer la base de donnée d’un état cohérant à un autre en une seule étape
  • 111. On dit qu’une transaction est ACID : • Atomique, au sens où on ne peut pas la diviser en une partie qui échoue et une partie qui réussit ; • Cohérente, au sens où une fois la transaction terminée, la base est de nouveau dans un état cohérent ; • Isolée, au sens où une transaction considère que, pendant son exécution, les données qu’elle manipule ne sont pas modifiées par une autre transaction ; • Durable, au sens où les modifications opérés par la transaction sont enregistrées de façon permanente (et recouvrables en cas de reconstruction de la base). Transactions
  • 112. • Opération commit , rollback Transactions Commit : Validation entière d’une transaction Rollback : Annule entièrement une transaction Savepoint : point de contrôle, état de la base où l’on pourra revenir plus tard Rollback to savepoint nom_save_point Exemple : MAJ 1 ; MAJ 2 ; savepoint SV__A; MAJ 3; MAJ 4 ; Si ( Condition est vraie) Rollback to savepoint SV__A; Fin si commit Si la condition est vraie le MAJ 3 et MAJ 4 seront annullées et les MAJ 1 et MAJ 2 seront validées Si la condition est fausse le commit qui vient après va valider les 4 mises à jour
  • 113. • Exemples de transactions Insert into tabale_1 values ( ‘val1’, ’val2 ‘….,’valn’); Delete from Table_2 where champ1 like ‘toto’; Commit; Transaction 1 Insert into tabale_3 values ( ‘val1’, ’val2 ‘….,’valn’); Commit; Transaction 2 Transactions
  • 114. Exercice Le pseudo code Numéro Instruction Questions Insert into T1 values( ……) ; Commit ; Update T2 set col1 where …… ; Delete from T1 where …… ; Savepoint SV1 ; Update T1 set colTT where …… ; Delete from T2 where …… ; Si (condition est vraie) alors Update T1 set colTT where …… ; Commit ; Sinon rollback to Savepoint SV1 ; Fin Si Delete from T2 where …… ; 1 2 3 4 5 6 7 Question 1) Quelles sont les instructions qui sont validés si la condition est vraie ( Réponse (écrire juste les numéros des instructions) : ………………………………………… ………………………………………… ………………………………………… …………………………………….. Question 2) Quel est le nombre des transactions qui seront executées dans ce programme Selon la condition Réponse : - cas condition est vraie ……………………….
  • 115. CHAPITRE 4 PL/SQL  Langage SQL en mode procédural (PL/SQL): 1) Introduction et Blocs PL/SQL 2) PL/SQL Déclaration des variables , boucle, alternatives, affichage , GOTO 3) La gestion des exceptions 4) Curseurs 5) Procédures et fonctions stockées 6) Sous-blocs PL/SQL 7) Les Déclencheurs (Triggers)
  • 116. Pourquoi PL/SQL ? PL/SQL = PROCEDURAL LANGUAGE/SQL  SQL est un langage non procédural  Les traitements complexes sont parfois difficiles à écrire si on ne peut utiliser des variables et les structures de programmation comme les boucles et les alternatives  On ressent vite le besoin d’un langage procédural pour lier plusieurs requêtes SQL avec des variables et dans les structures de programmation habituelles ▴ Langage PL/SQL
  • 117. Principales caractéristiques  Extension de SQL : des requêtes SQL cohabitent avec les structures de contrôle habituelles de la programmation structurée (blocs, alternatives, boucles).  La syntaxe ressemble au langage Pascal.  Un programme est constitué de procédures et de fonctions.  Des variables permettent l’échange d’information entre les requêtes SQL et le reste du programme ▴ Langage PL/SQL
  • 118.  PL/SQL peut être utilisé pour l’écriture des procédures stockées et des triggers. (Oracle accepte aussi le langage Java)  PL/SQL convient aussi pour écrire des fonctions utilisateurs qui peuvent être utilisées dans les requêtes SQL (en plus des fonctions prédéfinies). ▴ Langage PL/SQL Utilisation de PL/SQL
  • 119. Utilisation de PL/SQL (suite)  Le PL/SQL peut être utilisé sous 3 formes : 1 un bloc de code, exécuté comme une unique commande SQL, via un interpréteur standard (SQLplus ou iSQL*PLus) 2 un fichier de commande PL/SQL 3 un programme stocké (procédure, fonction, trigger) ▴ Langage PL/SQL
  • 120. Blocs Un programme est structuré en blocs d’instructions de 3 types : procédures ou bloc anonymes, SQL> start script.sql ou SQL>@ script.sql procédures nommées, fonctions nommées. Un bloc peut contenir d’autres blocs. Langage PL/SQL
  • 121. Structure d’un bloc anonyme DECLARE −- d e f i n i t i o n d e s v a r i a b l e s BEGIN −− c o d e du programme EXCEPTION −− c o d e de g e s t i o n d es erreurs END ; Seuls BEGIN et END sont obligatoires Les blocs se terminent par un ; Faisons ensemble un exemple sur SQL developer Langage PL/SQL
  • 122. -- Pour une fin de ligne /* Pour plusieurs lignes */ Langage PL/SQL Commentaires
  • 123. Langage PL/SQL Affichage : PROMPT , dbms_output.put_line Lecture : ACCEPT en précédant par & la variable à lire pour paramétrer la variable Exemple : voir les exemples de slide suivant ( n oublier pas celui du commentaire)
  • 124. set serveroutput on; declare r number; n1 number; n2 number; Begin n1:=6; n2 := 12; r:=n2/n1; dbms_output.put_line('rrr est egale à : '||r); exception when zero_divide then dbms_output.put_line(‘impossible de diviser par 0’); end ; / Exemple de base d’un bloc PL/SQL Langage PL/SQL
  • 125. Déclaration, initialisation des variables  Identificateurs Oracle : 30 caractères au plus, commence par une lettre, peut contenir lettres, chiffres,_ $ et # pas sensible à la casse.  Portée habituelle des langages à blocs  Doivent être déclarées avant d’être utilisées Langage PL/SQL
  • 126. Déclaration et initialisation Syntaxe : Nom_variable type_variable := valeur; Initialisation Nom_variable := valeur; Déclarations multiples interdites. Exemples age integer; nom varchar(30); dateNaissance date;  ok boolean := true; ▴ Langage PL/SQL
  • 127. Plusieurs façons d’affecter une valeur à une variable Opérateur d’affectation n:= Directive INTO de la requête SELECT. Exemples dateNaissance := to_date(’10/10/2004’,’DD/MM/YYYY’); Attention Pour eviler les conflits de nommage, préfixer les variables PL/SQL par v_ V_sal:= 4000 Select departement_id into det_id from employees where id_employees =509; SELECT nom INTO v_nom FROM employees WHERE id_employees =509; Langage PL/SQL
  • 128. SELECT ...INTO ... Instruction : SELECT expr1,expr2, ...INTO var1, var2, ... Met des valeurs de la BD dans une ou plusieurs variables var1, var2, ... Le SELECT ne doit retourner qu’une seule ligne Avec Oracle il n’est pas possible d’inclure un SELECT sans INTO dans un programme PL/SQL. Pour retourner plusieurs lignes, voir la suite du cours sur les curseurs. ▴ Langage PL/SQL
  • 129. Types de variables VARCHAR2 Longueur maximale : 32767 octets ; Exemples : name VARCHAR2(30); name VARCHAR2(30) := ’toto’ ; NUMBER(long,dec) Long : longueur maximale ; Dec : longueur de la partie décimale ; Exemples. Num_tel number(10); Salaire number(5,2):=142.12 ; ▴ Langage PL/SQL
  • 130. DATE Fonction TO DATE ; Exemples : Start_date := to_date(’29-SEP-2003’,’DD-MON-YYYY’); La vraible sttart date est evaluée et analysée par oracle par 2 chiffre pour le jour, trois letters pour le mois et l’année sur 4 chirffrer separées par un tiret (-) start_date := to _date(’29-SEP-2003:13:01’,’DD-MON-YYYY:HH24:MI’) ; Ici La vraible start_date est evaluée et analysée par oracle par 2 chiffre pour le jour, trois letters pour le mois et l’année sur 4 chirffrer separées par un tiret (-). Avec aussi l’heurs et les minutes BOOLEAN TRUE FALSE NULL ▴ Types de variables (suite) Langage PL/SQL
  • 131. Déclaration %TYPE et %ROWTYPE V_nom emp.nom%TYPE On peut déclarer qu’une variable est du même type qu’une colonne d’une table (ou de meme type qu’ autre variable). V_employe emp%ROWTYPE; Une variable peut contenir toutes les colonnes d’un tuple d’une table (la variable v_employe contiendra une ligne de la table emp). Important pour la robustesse du code ▴ Langage PL/SQL
  • 132. DECLARE v_employe EMPLOYEES%ROWTYPE; v_nom EMPLOYEES.FIRST_NAME%TYPE; BEGIN SELECT * INTO v_employe FROM EMPLOYEES WHERE employee_id=100 ; v_nom :=v_employe.FIRST_NAME; v_employe.department_id:=20; v_employe.employee_id:=7777; v_employe.EMAIL:='changyah'; INSERT into employees VALUES v_employe; dbms_output.put_line ('ttt '|| v_employe.employee_id); END; Vérifier à bien retourner un seul tuple avec la reqête SELECT ...INTO ... ▴ Déclaration %TYPE et %ROWTYPE -Exemple Langage PL/SQL
  • 133. Exercice : a- Créer un bloc PL/SQL pour insérer un nouveau département dans la table DEPARTEMENTS (DEPT_ID, DEPT_NAME, LOCATION_ID) - Utiliser la séquence DEPT_ID_SEQ pour générer un numéro de département (DEPT_ID). - Créer un paramètre pour lire le nom du département du clavier. - Laisser le numéro de LOCATION_ID à NULL. - Afficher le numéro de département qu’on vient d’inserer b- enregistrer le code dans le fichier scipt1.sql , donner la commande d’exécution de scipt1.sql .
  • 134. Solution set serveroutput ON ACCEPT p_dept_nom PROMPT ‘Entrer un nom de département : ‘ Declare Numd number; BEGIN INSERT INTO departments VALUES (dept_id_seq.NEXTVAL, '&p_dept_nom', NULL,null); COMMIT; Select dept_id_seq.CURRVAL into Numd from dual; dbms_output.put_line ('num depart inseré est '|| Numd); END; / Execution ( le code est enregistré dans le fichier script1.sql SQL> start script1.sql Ou SQL> @ script1.sql
  • 135. Exercice 2 Créer un bloc PL/SQL pour supprimer le département créé précédemment en -Créant r un paramètre pour le numéro de département à supprimer , -A ffichant le nombre de département avant et après la suppression
  • 136. 1 Langage PL/SQL : Commandes Les alternatives (if , else, elesif, case ) Les boucles (loop, while , for ) Affichage dbms_output.put_line () et retour chariot chr(10) La commande GOTO
  • 137. Test conditionnel IF-THEN IF v_date > ’01−JAN−08’ THEN V_salaire := V_salaire *1.15; END I F ; IF-THEN-ELSE IF v_date > ’01−JAN−08’ THEN V_salaire := v_salaire ∗ 1.15; ELSE V_salaire := v_salaire ∗ 1.05; END I F ; ▴ Langage PL/SQL : Commandes
  • 138. IF-THEN-ELSIF IF v_nom =’PARKER’ THEN V_salaire:= V_salaire * 1.15; ELSIF v_nom =’ SMITH ’ THEN V_salaire:= V_salaire *1.05 END I F ; ▴ Langage PL/SQL : Commandes Test conditionnel(2)
  • 139. CASE CASE selection WHEN expression1 THEN resultat1 ou instruction 1 WHEN expression2 THEN resultat2 ou instruction 2 ELSE autre resultat ou autre instruction END ; CASE renvoie une valeur qui vaut resultat1 ou resultat2 ou . . . ou resultat par défaut . Exemple de Case Dans une requette SQL ▴ Langage PL/SQL : Commandes SELECT last_name, first_name ,job_id, CASE WHEN job_id='AD_PRES' THEN 'C est le président' WHEN job_id='AD_VP ' THEN ' Vice Président chargé de la Administration' WHEN job_id='FI_MGR' THEN ' Administrateur Financier' WHEN job_id='FI_ACCOUNT' THEN ' Comptable' WHEN job_id='AC_ACCOUNT' THEN ' Trésorier' ELSE 'Autre fonction' END FROM employees;
  • 140. Declare LN$Num integer := 0 ; Begin LN$Num := '&entre' ; CASE LN$Num WHEN 1 Then dbms_output.put_line( ' premier' ) ; WHEN 2 Then dbms_output.put_line( 'deuxieme' ) ; WHEN 3 Then dbms_output.put_line( 'troisiem' ) ; ELSE dbms_output.put_line( 'rang supérieur' ) ; END CASE ; End ; / CASE : Exemple dans un bloc PL/SQL Langage PL/SQL : Commandes Case Simple
  • 141. DECLARE v_prix_vente NUMBER(9,2); v_Value NUMBER(9,2) := &v_prix_vente; v_taux_Commission NUMBER(3,2); BEGIN CASE WHEN v_Value <= 100 THEN v_taux_Commission := 0.03; WHEN v_Value <= 250 THEN v_taux_Commission := 0.05; WHEN v_Value <= 1000 THEN v_taux_Commission := 0.08; ELSE v_taux_Commission := 0.10; END CASE; DBMS_OUTPUT.PUT_LINE('Montant de la Commission est : ' || TO_CHAR(v_taux_Commission * v_Value) || 'Dirhames'); END; CASE : Exemple dans un bloc PL/SQL Langage PL/SQL : Commandes Pour le CASE l'omission de la clause ELSE provoque une erreur s’il rencontre un cas non traité Case de recherche
  • 142. LOOP instructions ; EXIT [WHEN condition ] ; instructions ; END LOOP ; WHILE condition LOOP instructions ; END LOOP ; Exemple LOOP Monthly_value := daily_value*31 EXIT WHEN monthly_value > 4000; END LOOP ; Obligation d’utiliser la commande EXIT pour éviter une boucle infinie. ▴ Langage PL/SQL : Commandes Les boucles : LOOP
  • 143. Exemple : Insérer 10 articles avec la date d’aujourd’hui. declare . . . V_Date DATE; V_compteur NUMBER( 2 ) := 1 ; BEGIN . . . V_Date := SYSDATE; LOOP INSERT INTO article ( Artno , ADate ) VALUES ( v_compteur , v_Date ) ; V_compteur := V_compteur + 1 ; EXIT WHEN V_compteur > 1 0; END LOOP; . . . END;/ Langage PL/SQL : Commandes Les boucles : LOOP
  • 144. FOR indice IN [ REVERSE ] debut . . fin LOOP instructions ; END LOOP ; Le mot clef REVERSE à l’effet escompté. Exemple FOR ii IN REVERSE 1..15 LOOP jj:=ii*31; END LOOP ▴ Ne pas déclarer indice, il est déclaré implicitement. Langage PL/SQL : Commandes Les boucles : FOR - La boucle FOR du PL/SQL s'incrémente (ou se décrémente) forcément de 1 en 1. - On pourra également utiliser un curseur dans la clause IN - Vous pouvez cependant simuler un pas supérieur, comme le montre cet extrait de la doc : DECLARE step INTEGER := 2; BEGIN FOR i IN 1..5 LOOP DBMS_OUTPUT.PUT_LINE (i*step); END LOOP; END; Exemple
  • 145. Langage PL/SQL : Commandes GOTO GOTO <libelé>; PL/SQL contient aussi la commade GOTO qui permet de faire le branchement d’un programme d’un point un autre point durant son execution, ça syntaxe est :
  • 146. DECLARE v_compteur NUMBER(2) := 1; BEGIN LOOP v_compteur := v_compteur + 1; IF v_compteur > 5 THEN GOTO stop_processing; END IF; DBMS_OUTPUT.PUT_LINE('v_compteur est : ' || v_compteur); END LOOP; <<stop_processing>> DBMS_OUTPUT.PUT_LINE(' la valeur finale de v_compteur final est ' || v_compteur ); END; Langage PL/SQL : Commandes GOTO
  • 147. Activer le retour écran : set serveroutput on size 10000 Sortie standard : dbms_output.put_line (chaıne); Concaténation de chaînes : opérateur || Exemple DECLARE i number (2); BEGIN FOR i IN 1 .. 5 LOOP dbms_output.put_line('Nombre: ‘|| i ); END LOOP; END ; / ’ Le caractère / seul sur une ligne déclenche l’évaluation. ▴ Si on veut un retour chariot on place le caractére suivant: chr(10) Langage PL/SQL : Commandes Affichage
  • 148. Exemple bis DECLARE compteur number(3); BEGIN SELECT COUNT( ∗ ) INTO compteur FROM Etudiant ; FOR i IN 1.. compteur LOOP dbms_output.put_line(‘Nombre : ‘|| i); END LOOP ; END ; Langage PL/SQL : Commandes Affichage
  • 149. Gestion des Erreurs  Section Exception  Anomalie programmeur  Erreur Oracle
  • 150. Section Exception  Notion d’exception: traitements d’erreurs  Types d’erreurs:  Erreurs internes Oracle (Sqlcode <> 0)  Erreurs programme utilisateur  Règles à respecter  Définir et donner un nom à chaque erreur  Associer ce nom à la section Exception (partie declare)  Définir le traitement dans la partie Exception
  • 151. Gestion des Exceptions EXCEPTION WHEN nom_exception1 THEN instructions_PL_SQL; … WHEN nom_exceptionN Then instructions PL/SQL; … [WHEN OTHERS THEN instrctions_PL/SQL;] END; Sortie du bloc après exécution du traitement Syntaxe
  • 152. DECLARE ..... nom_erreur EXCEPTION; BEGIN ..... IF anomalie THEN RAISE nom_erreur ; ..... EXCEPTION WHEN nom_erreur THEN traitement; END; Gestion des Exceptions Syntaxe : en cas de déclaration définition
  • 153. Gestion d’une erreur : exemple DECLARE sal_nul EXCEPTION; sal employees.salary%TYPE; BEGIN SELECT salary INTO sal FROM employees where employee_id=60000; IF sal > 100000 THEN RAISE sal_nul; Else dbms_output.put_line(‘vous pouvez augmenter le salaire de vos employés’); END IF; dbms_output.put_line(‘ Bye’); EXCEPTION WHEN sal_nul THEN dbms_output.put_line(‘plafond dépassé’); When zero_divide then dbms_output.put_line(‘attention ‘); END;
  • 154. Exceptions Prédéfinies • DUP_VAL_ON_INDEX – Lorsqu’une instruction SQL tente de créer une valeur dupliquée dans une colonne sur laquelle un index unique a été défini • INVALID_NUMBER – Lorsqu’une instruction SQL spécifie un nombre invalide (conversion d’un caractère à un entité ex: select * from employees where employee_id=‘Chaine_de_caractère‘ - lors d’une insertion • NO_DATA_FOUND – Lorsqu’une instruction Select ne retourne aucune ligne • TOO_MANY_ROWS – Une instruction Select ne peut pas renvoyer plus d’une ligne sans provoquer l’exception TOO_MANY_ROWS • VALUE_ERROR – Provoquée dans des situations d’erreur résultant de valeurs tronquées ou converties ( exp: taille de la variable petite que le nombre à affecter) • ZERO_DIVIDE: au cas ou il y a une instruction qui effectue une division par Zéro
  • 155. Exemple Declare emp_Rec employees%ROWTYPE; Begin select * into emp_Rec from employees where employee_ID = 777; Exception when No_Data_Found then dbms_output.put_line(‘Aucune donnée retournée’); when other then null; End; / Aucune donnée retournée Procedure PL/SQL terminé avec succès.
  • 156. Déclaration d’une Exception Declare pas_comm EXCEPTION; salaire employees.salary%TYPE; commi employees.commition%TYPE; numero employees.employee_id%TYPE; Begin Select salary, commition, employee_id into salaire, commi, numero from employees where employee_id := &num_emp; If commi = 0 or commi is null then raise pas_comm else traitement … end if; Exception When pas_comm then dbms_output.put_line(‘ Pas de commission pour l’employé ID: ’|| numero); End; NB: num_emp fait référence à une variable extérieure au bloc PL/SQL)
  • 157. Test d’exécution avec SQLCODE et SQLERRM • SQLCODE – Fonction prédéfinie qui renvoie le statut d’erreur système de l’instruction qui vient d’être exécutée (si sans erreur, SQLCODE = 0). • SQLERRM – Fonction prédéfinie qui renvoie le message d’erreur associé à la valeur retournée par SQLCODE (si sans erreur, SQLERRM = ‘ORA-0000’). Declare Begin dbms_output.enable; // equivalente à set serveroutput on dbms_output.put_line(‘SQLCODE: ‘ || to_char(SQLCODE)); dbms_output.put_line(‘SQLERRM: ‘ || SQLERRM); End; / SQLCODE: 0 SQLERRM: ORA-0000: exécution normale, terminé avec succès Exemple 1:
  • 158. Declare v number; Begin select salary into v from employees; dbms_output.enable; -- equivalente à set serveroutput on Exception when TOO_MANY_ROWS then dbms_output.put_line('SQLCODE:'|| to_char(SQLCODE)); dbms_output.put_line('SQLERRM:' || SQLERRM); End; Test d’exécution avec SQLCODE et SQLERRM Exemple 2:
  • 159. Declare pas_err EXCEPTION; v number; Begin select salary into v from employees where employee_id=100; if(SQLCODE=0) then raise pas_err; end if; Exception when TOO_MANY_ROWS then dbms_output.put_line('SQLCODE:'|| to_char(SQLCODE)); dbms_output.put_line('SQLERRM:' || SQLERRM); when NO_DATA_FOUND OR TOO_MANY_ROWS then dbms_output.put_line('SQLCODE:'|| to_char(SQLCODE)); dbms_output.put_line('SQLERRM:' || SQLERRM); WHEN pas_err THEN dbms_output.put_line('C''est corecte '); End; Test d’exécution avec SQLCODE et SQLERRM Exemple 3: complet
  • 160. Les curseur • Définition – Un curseur est un mécanisme permettant de rechercher un nombre arbitraire de lignes avec une instruction SELECT. • Deux types de curseurs: – Le curseurs implicite: généré et géré par le noyau pour chaque ordre SQL d’un bloc – Le curseur explicite: généré para l’utilisateur pour traiter un ordre SELECT qui ramène plusieurs lignes.
  • 161. Quatre Étapes de traitement d’un curseur explicite Les curseurs explicites sont traitées en suivant un modèle en quatre étapes.  Déclarer le CURSEUR: le curseur doit apparaitre dans la partie déclaration de bloc pl/sql  Ouvrir le CURSEUR : par l’instruction OPEN,  Parcourir les ligne du CURSEUR : par l’ instruction FETCH.  Fermer le CURSEUR : une instruction close .
  • 162. Déclaration d’un curseur explicite • Se fait dans la section Declare Syntaxe : cursor nom_curseur is ordre_select Declare cursor dept_10 is select first_name , salary From employees where department_id= 10 order by salary; nom employees .first_name%TYPE; salaire employees . salary%TYPE; Begin … End; Exemple :
  • 163. • L’ouverture: – Allocation de mémoire pour le lignes du curseur – L’analyse syntaxique et sémantique du select – Le positionnement de verrous éventuels • L’ouverture se fait dans la section Begin • Syntaxe: OPEN nom_curseur; Declare cursor dept_10 is select first_name , salary From employees where department_id= 10 order by salary; Begin …; open dept_10; …; End; Ouverture d’un curseur : Open
  • 164.  Les lignes ramenées sont traitées une par une, la valeur de chaque colonne doit être stockée dans une variable réceptrice  Syntaxe: Fetch nom_curseur into liste_variables;  Le Fetch ramène une ligne à la fois. Traitement des lignes : Fetch
  • 165. Exemple : Fetch Declare cursor dept_30 is select first_name , salary From employees where department_id= 30 order by salary; nom employees .first_name%TYPE; salaire employees . salary%TYPE; Begin Open dept_30; Loop Fetch dept_30 into nom, salaire; If salaire > 2500 then insert into résultat values (nom,salaire); end if; exit when salaire >= 5000; end loop; … End;
  • 166. Fermeture : close • Syntaxe: Close nom_curseur; • Action: libère la place de mémoire Declare cursor dept_10 is select first_name , salary From employees where department_id= 10 order by salary; nom employees .first_name%TYPE; salaire employees . salary%TYPE; Begin Open dept_10; Loop Fetch dept_10 into nom, salaire; If salaire > 2500 then insert into résultat values (nom,salaire); end if; exit when salaire >= 5000; end loop; close dept_10; End;
  • 167. Exemple : close Declare Cursor c1 is select first_name, salary from employees order by sal desc; v_ename employees. first_name %TYPE; v_sal employees.salary%TYPE; Begin open c1; loop fetch c1 into v_ename, v_sal; Exit when (c1%notfound) ; insert into resultat values (v_sal, v_ename); end loop; close c1 End;
  • 168. • Définition indicateurs sur l’état d’un curseur.  %FOUND : nom_curseur%FOUND  TRUE: le dernier FETCH a ramené une ligne  FALSE: plus de ligne  %NOTFOUND: nom_curseur%NOTFOUND  TRUE: le dernier FETCH n’a pas ramené de ligne  %ISOPEN: nom_curseur%ISOPEN  TRUE: le curseur est ouvert  %ROWCOUNT: nom_curseur%rowcount  Nbre de lignes ramenées par le Fetch Les attributs d’un curseur
  • 169. Pour manipuler les attribut d’un curseur implicite on utilise SQL%Attribut Exemples :  SQL%FOUND , SQL% ROWCOUNT Pour manipuler les attribut d’ un curseur explicite on utilise nom_curseur%Attribut Exemples : nom_curseur%FOUND , nom_curseur % ROWCOUNT) Utilisation des attribut du curseur
  • 170. Utilisation des attribut du curseur Curseur Implicite : utilisation de l’attribut par SQL%Attribut CREATE TABLE temp_Employee9 AS SELECT * FROM Employees; DECLARE e_DeptNumber employees.Department_id%TYPE :=9; BEGIN DELETE FROM temp_Employee9 WHERE Department_id <> e_DeptNumber; IF SQL%FOUND THEN – Il y a des enregistrement supprimmée DBMS_OUTPUT.PUT_LINE('Nombre des enregistrement supprimés: ‘ || TO_CHAR(SQL%ROWCOUNT)); ELSE DBMS_OUTPUT.PUT_LINE('AUCUN enregistrement n''supprimés '); END IF; END;
  • 171. Exemple - %FOUND Declare cursor dept_ 30 is select first_name , salary From employees where department_id= 30 order by salary; nom employees .first_name%TYPE; salaire employees . salary%TYPE; Begin Open dept_30; Fetch dept_30 into nom, salaire; While dept_30%FOUND Loop If salaire > 2500 then insert into résultat values (nom,salaire); end if; Fetch dept_30 into nom, salaire; end loop; close dept_30; End;
  • 172. Exemple - %NOTFOUND Declare cursor dept_10 is select first_name , salary From employees where department_id= 10 order by salary; nom employees .first_name%TYPE; salaire employees . salary%TYPE; Begin Open dept_10; Loop Fetch dept_10 into nom, salaire; Exit when dept_10%NOTFOUND; If salaire > 2500 then bdms_output.put_line( nom ||’ ,’ ||salaire); end if; end loop; close dept_10; End;
  • 173. Exemple - %ISOPEN Declare cursor dept_10 is select first_name , salary From employees where department_id= 10 order by salary; nom employees .first_name%TYPE; salaire employees . salary%TYPE; Begin If not(dept_10%ISOPEN) then Open dept_10; end if; Loop Fetch dept_10 into nom, salaire; Exit when dept_10%NOTFOUND; If salaire > 2500 then insert into résultat values (nom,salaire); end if; end loop; close dept_10; End;
  • 174. Exemple - %ROWCOUNT Declare cursor dept_10 is select first_name , salary From employees where department_id= 10 order by salary; nom employees .first_name%TYPE; salaire employees . salary%TYPE; Begin Open dept_10; Loop Fetch dept_10 into nom, salaire; Exit when dept_10%NOTFOUND or dept_10%ROWCOUNT > 15; If salaire > 2500 then insert into résultat values (nom,salaire); end if; end loop; close dept_10; End;
  • 175. Boucle LOOP Exit when pour un curseur declare cursor c is select department_id, first_name from employees where department_id = 10; Name employees.first_name%type; Dept employees. department_id%type; Begin Open c; LOOP FETCH c into dept, name ; Exit when c%NOTFOUND ; dbms_output.put_line(name ); END LOOP; CLOSE c; end; Dans cette boucle on est obligé d’utiliser : Open LOOP FETCH CLOSE Exit when
  • 176. Utiliser WHILE élimine le besoin de l’instruction EXIT WHEN en intégrant l'utilisation de l'attribut % FOUND. 2 instructions FETCH (Une juste avant le while et l’autre avant le END LOOP) Boucle WHILE pour un curseur declare cursor c is select department_id, first_name from employees where department_id = 10; Name employees.first_name%type; Dept employees.department_id%type; Begin Open c; FETCH c into dept, name ; while c%FOUND loop dbms_output.put_line(name); FETCH c into dept, name ; End loop; CLOSE c; end;
  • 177. ‰ Elle simplifie la programmation car elle évite d’utiliser explicitement les instruction open, fetch, close, exit ‰ En plus elle déclare implicitement une variable de type « row » associée au curseur Boucle FOR pour un curseur declare cursor c is select department_id, first_name from employees where department_id = 10; begin FOR emp IN c LOOP dbms_output.put_line(emp.first_name); END LOOP; end;
  • 178. declare n NUMBER := 14; CURSOR C IS SELECT * FROM EMPLOYEES WHERE employee_id>= n ; BEGIN FOR CUR IN C LOOP DBMS_OUTPUT.PUT_LINE ( CUR.FIRST_NAME) ; END LOOP ; END ; / Curseur avec des paramètres A votre avis, le code suivant est-il valide ? Non. La requête d’un curseur ne peut pas contenir de variables dont les valeurs ne sont pas fixées. Pourquoi ? Parce que les valeurs des ces variables sont susceptibles de changer entre la déclaration du curseur et son ouverture. Le remède est un curseur paramétré.
  • 179. Vous pouvez modifier les lignes de données renvoyées dans un jeu de résultats en généralisant code PL/SQL grâce à l'utilisation des paramètres. Les paramètres peuvent être utilisés pour spécifier les critères de sélection de la requête lorsque vous ouvrez le curseur. Déclarer curseurs entre parenthèses par nom et type de données, comme indiqué ici. Lorsque vous avez besoin de spécifier plusieurs parameter pour un curseurs, séparez les entrées par une virgule.  La syntaxe est : CURSOR mycursor (param1 NUMBER, param2, type2 ...., paramn typen ) IS SELECT ...... FROM tables WHERE (condition sur les parameters) Curseur avec des paramètres
  • 180. Curseur avec des paramètres Ouverture On ouvre un curseur paramétré en passant en paramètre les valeurs des variables : OPEN Nom_curseur ( liste de sparamètres ) Exemple OPEN enfants ( 1 ) ; Lecture par la Boucle FOR FOR variable IN nom_curseur ( liste paramètre s ) LOOP /∗ instructions ∗/ END LOOP ;
  • 181. Declare CURSOR mycursor (param1 number, param2 number) is select Employee_ID , salary from employees where employee_id between param1 and param2; e_Record mycursor%rowtype; BEGIN OPEN mycursor('102','110'); FETCH mycursor INTO e_Record; loop DBMS_OUTPUT.PUT_LINE('Salare de ' || e_Record.Employee_ID || ': ' || e_Record.Salary ||' $'); FETCH mycursor INTO e_Record; exit when mycursor%notfound; end loop; CLOSE mycursor; / Passer des paramètres à un curseur Exemple Recapitulatif
  • 182. Exercices : 1) En utilisant un Curseur, Écrivez un programme PL/SQL qui calcule la moyenne des salaires des employés dont la date de recrutement est entre 01/01/2002 et 01/01/2005. Comparer avec la requête ci-dessous, vous devez trouver la même chose (SELECT avg(salary) FROM employees WHERE ( to_date(hire_date,'DD/MM/YY') between '01/01/02' and '01/01/05' ); 2) Refaire la meme question en passant les deux dates 01/01/2002 et 01/01/2005. En paramètre de curseur
  • 183. Procédures et Fonctions stockées Décrire les différentes utilisation des procédure et fonctions Créer des procédures et fonction stockées Appeler une procédure et une fonction Supprimer une procédure et une fonction Objectifs:
  • 184. Procédures stockées Tout comme n’importe quel autre langage procédural, PL / SQL a des blocs de code qui sont appelées procédures. Vous pouvez appeler ces procédures par les autres blocs de code, ou directement à partir de SQL * Plus (ou par un autre programme client). GRANT CREATE PROCEDURE TO utilisateur_désiré; Avant de créer des procédure il faut avoir les droits nécessaire
  • 185. CREATE or replace PROCEDURE Bonjour IS BEGIN DBMS_OUTPUT.PUT_LINE(‘Bonjour Tout le monde’ ); END; Procédures stockées Un Simple exemple de procédure Dans un autre bloc PL/SQL BEGIN Bonjour(); END; Appel de la procédure Par commande SQL*Plus exec Bonjour(); Ou bien Call Bonjour();
  • 186. CREATE OR REPLACE PROCEDURE nom_procedure ( paramètres IN , OUT ) IS BEGIN Corps_de_la_procedure END; nom_procedure : est le nom de la procédure, il doit être significatif Corps_de_la_procedure: est une suite d’instruction PL/SQL qui définissent la suite logique de la procédure Procédures stockées Syntaxe générale
  • 187. Paramètres Les paramètres sont optionnels dans les procédure, dans l’exemple que nous avons déjà vu il n y a pas de paramètres CREATE OR REPLACE PROCEDURE HELLOWORLD IS BEGIN DBMS_OUTPUT.PUT_LINE(’Hello World!’); END; Procédures stockées Où cas où il y a des paramètres on les introduit comme on le fait lors de la création des tables  (nom_param type ) Exemple ( N int , titre varchar)
  • 188. CREATE OR REPLACE PROCEDURE DISPN (N INT) IS BEGIN DBMS_OUTPUT.PUT_LINE(‘N est : ‘ || N); END; Nous allons écrire une simple procédure admettant un seul paramètre Cette procédure affiche la valeur de nombre N passé en paramètre SQL>call DISPN(555) N est : 555 1 seul paramètre: Exemple Procédures stockées
  • 189. CREATE OR REPLACE PROCEDURE DISP_AB (A INT, B INT) IS BEGIN DBMS_OUTPUT.PUT_LINE(’A + B = ’ || (A + B)); DBMS_OUTPUT.PUT_LINE(’A * B = ’ || (A * B)); END; Plusieurs paramètres: Exemple Procédures stockées SQL> CALL DISP_AB(17,23); A + B = 40 A * B = 391
  • 190. paramètres: Exemple avec une chaine de caractère Procédures stockées CREATE OR REPLACE PROCEDURE DISP_NAME (NAME VARCHAR) IS BEGIN DBMS_OUTPUT.PUT_LINE(’Hi ’ || NAME || ’!’); END; SQL> CALL DISP_NAME(’Billal Merssi’); Hi Billal Berssi !
  • 191. Quand on ne fait pas d’option les paramètres sont considérer comme IN par défaut IN : pour un paramètre en entrer  il est généralement placé après l’affectation ( := ) OUT: pour un paramètre qui va recevoir des données dans le corps de la procédure il est généralement placé avant l’affectation ( := ) IN OUT: pour des paramètre qui sont à la fois des IN et des OUT Options : IN, OUT, IN OUT Procédures stockées
  • 192. CREATE OR REPLACE PROCEDURE SUM_AB (A INT, B INT, C OUT INT) IS BEGIN C := A + B; END; DECLARE R INT; BEGIN SUM_AB(23,29,R); DBMS_OUTPUT.PUT_LINE(’SUM IS: ’ || R); END; Options : IN, OUT, IN OUT: exemple Procédures stockées Faites appel à la procédure dans un bloc PL/SQL !
  • 193. CREATE OR REPLACE PROCEDURE DOUBLEN (N IN OUT INT) IS BEGIN N := N * 2; END; DECLARE R INT; BEGIN R := 7; DBMS_OUTPUT.PUT_LINE(’BEFORE CALL R IS: ’ || R); DOUBLEN(R); DBMS_OUTPUT.PUT_LINE(’AFTER CALL R IS: ’ || R); END; Faites appel à la procédure dans un bloc PL/SQL ! Exemple avec : IN OUT Procédures stockées
  • 194. CREATE PPROCEDURE baisse_prix( nprod IN NUMBER, Taux IN NUMBER ) IS BEGIN if Taux <1 then UPDATE produit SET PU= PU* ( 1 - Taux) WHERE Nump= nprod ; end if; END Procédures stockées Exemple : Créer une procédure qui permet de baisser le prix d'un produit de la table: Produit (Nump, nomp, pu, qstock)
  • 195. Une fonction est un bloc PL/SQL nommé qui peut accepter des paramètres et être appelé. En règle générale, vous utilisez une fonction pour calculer une valeur Une fonction doit comporter une clause RETURN dans l'en-tête, et au moins une instruction RETURN dans la section exécutable. Les fonctions peuvent être stockées en tant qu'objets de schéma dans la base de données en vue d'exécutions répétées. Fonctions stockées
  • 196. Fonctions stockées CREATE [OR REPLACE] FUNCTION num_fonction [( param1 [mod1] datatype1, param2 [mod2] datatype 2, ….)] RETURN datatype IS|AS Block PL/SQL ; Syntaxe pour créer une fonction
  • 197. Paramètre Description function_name Nom de la fonction. parameter Nom d'une variable PL/SQL dont la valeur est transmise à la fonction. mode Type du paramètre. Seuls les paramètres IN doivent être déclarés. datatype Type de données du paramètre. RETURN datatype Type de données de la valeur RETURN qui doit être fournie par la fonction. PL/SQL block Corps de la procédure qui définit l'action exécutée par la fonction. Fonctions stockées Description des paramètres
  • 198. Fonctions stockées Exemple de création d’une fonction stockée get_salaty.sql create or replace function get_sal (p_id in employees.employee_id%type) return number is v_salary employees.salary%type:=0; begin select salary into v_salary from employees where employee_id=p_id; return v_salary; end ; /
  • 199. 1- Créez le script pour définir la fonction get_salary. avec un paramètre IN pour renvoyer une valeur numérique. 2- Exécutez le script pour créer la fonction get_salary. 3- Appelez la fonction dans une expression PL/SQL, pour elle renverra une valeur à l'environnement appelant, ( par exemple affichage la valeur ) Remarque: - La section de traitement des exceptions peut également contenir une instruction RETURN. Fonctions stockées Exemple suite
  • 200. Fonctions stockées Appel d'une procédure ou fonction SQL> Declare A employees.employee_id%type; S number BEGIN A := &Numero_de_employe; --lire à partir du clavier S :=get_sal (A); dbms_output.put__line(S ); END ; /
  • 201. Exemple 2 -Créer une fonction TAX qui sera appelée à partir d'une instruction SELECT. - La fonction accepte un paramètre NUMBER et renvoie la taxe après avoir multiplié la valeur du paramètre par 0,08. Create or replace function tax( p_value in number) Return number is Begin Return (p_value * 0.08); End tax; Fonctions stockées SELECT employee_id, first_name,tax(salary) FROM employees WHERE tax(salary)>(SELECT MAX(tax(salary)) FROM employees WHERE department_id = 30) ORDER BY tax(salary) DESC; - Appelez la fonction TAX au sein d'une interrogation affichant: le code, le nom le prélèvement fiscal de l'employé dont la tax est sup au max des tax de département 30 Appel d'une procédure ou fonction (suite)
  • 202. Si la base de données évolue, il faut recompiler les procédures existantes pour qu’elles tiennent compte de ces modifications La commande est la suivante: ALTER { FUNCTION | PROCEDURE } nom COMPILE Exemple: ALTER PROCEDURE Baisse_prix COMPILE; ALTER FUNCTION NomClient COMPILE; Fonctions stockées Modification d’une procédure ou fonction
  • 203. Lorsqu'une fonction stockée n'est plus nécessaire, vous pouvez la supprimer en utilisant une instruction SQL Pour supprimer une fonction stockée en exécutant la commande SQL DROP FUNCTION nom_fonction DROP PROCEDURE nom_procedure; La commande CREATE OR REPLACE est comparé à DROP puis CREATE Supprimer des fonctions et procédure Fonctions stockées
  • 204. •Un bloc PL/SQL peut contenir un sous bloc: Declare Variables Begin ….. Declare Variables Begin …. End; ….. End; Les sous-blocs
  • 205. Declare a number; b varchar2(30); c number; Begin a:=10; b:='Imagination'; c:= 20; Declare d number; Begin d:=c+5; a:=40 ;b:='programmation'; End; b:=b||' Esprit'; a:=a+d; dbms_output.put_line(a||'' ''||b||'' ''||c)); End; Exemple Les sous-blocs
  • 206. Les Déclencheurs (Triggers) DANS PL/SQL  Définir un Déclencheur (Trigger)  Décrire les différents types de triggers  Décrire les triggers de la base de données et leurs utilisation  Créer des triggers  Décrire les régles de déclenchement des triggers  Gérer ( supp. , modif, dé/activation les triggers
  • 207. Définition : Un Trigger : Est un bloc ou d'une procédure PL / SQL associé à une table, une vue, un schéma ou à une donnée qui s’exécute implicitement(automatiquement) à chaque fois qu'un événement particulier a lieu. Les Déclencheurs (Triggers) DANS PL/SQL Type de Triggers Triggers d’application: est déclenché chaque fois qu'un événement se produit avec une application particulière Triggers base de données: est déclenché chaque fois qu'un événement de données (comme DML) ou un événement du système (telles que l'ouverture de session ou d'arrêt) se produit sur un schéma ou base de données
  • 208. Directives pour la conception Triggers Les Déclencheurs (Triggers) DANS PL/SQL Vous pouvez concevoir les Triggers pour :  Effectuer des actions connexes  Centraliser des opérations globales Vous ne devez pas concevoir Triggers Si :  Leurs fonctionnalités est déjà intégrée dans le serveur Oracle  ils dupliquent la même tache d'autres Triggers Vous pouvez créer des procédures stockées et les invoquer dans un Triggers, si le code PL / SQL est très longue. L'utilisation excessive de Triggers peut entraîner des interdépendances complexes, ce qui peut être difficile à maintenir dans de grandes applications
  • 209. CREATION de TRIGGER Les Déclencheurs (Triggers) DANS PL/SQL CREATE [OR REPLACE] TRIGGER nom_trigger Quand Evenement 1 [OR Evenement 2 OR Evenement3] ON nom_Objet [[REFERENCING OLD AS old | NEW AS new] FOR EACH ROW // pour chaque ligne [WHEN (condition)]] Begin Corps de trigger (PL/SQL bloc ) End;
  • 210. nom_trigger : unique pour les trigger du meme schéma. Quant : indique quand le trigger va se déclancher en fonction avec l’evenement qui va se passer dans la BD : BEFORE, AFTER, et INSTEAD OF. Evenement : identifie l’opération DML qui provoque le declenchement INSERT, UPDATE [OF column], et DELETE. Nom_objet : indique la table ou la vue associés au trigger. Les composantes de la syntaxe de creation de Triggers : Les Déclencheurs (Triggers) DANS PL/SQL
  • 211. Pour le trigger ligne vous pouvez specifier : REFERENCING : pour corréler les valeur old et new pour la ligne courante (par default OLD et NEW) FOR EACH ROW : pour indiquer que le trigger est une trigger ligne WHEN : clause pour appliquer un filtre, qui sera mis entre parentheses, Corps de trigger : C’est l’action à efectuer par le trigger, qui est implementé comme suit:  Un bloc anonyme PL/SQL (DECLARE ou BEGIN, et un END)  Appel à une procedure/fonction stoquée ou bien un package (CALL , EXECUTE) Les composantes de la syntaxe de creation de Triggers (Suite) : Les Déclencheurs (Triggers) DANS PL/SQL
  • 212. Le type de trigger DML determine Si le Corps de trigger s’exécute pour chaque ligne ou une seule fois pour l’evenement déclanchant: Type 1: Les trigger de table (Trigger STATEMENT) : Excecutés une fois pour l’evenement déclanchante C’est le type par défaut des triggers Déclanchés meme s’il n y a aucune ligne affécté par l”evnement Type 2: Les Triggers ligne : Exécutés « séparément » pour chaque ligne affécté par l”evnement Ne sont pas executé Si l’evenement n’a affecté aucun ligne Sont indiqués en précisant la clause FOR EACH ROW Types de Triggers DML Les Déclencheurs (Triggers) DANS PL/SQL
  • 213. Quand le trigger se déclence ? BEFORE: (Avant) Executer le trigger avant de proceder à l’evenement DML sur la table. AFTER (Aprés) Executer le trigger aprés l’evenement DML sur la table. INSTEAD OF: (au lieu de) Executer le corps de trigger au lieu de l’évenement. Ceci est utilisé pour les VUES qui ne sont pas modifiable Note: Si plusieurs Triggers sont définis pour un meme objet leurs déclancement est arbitraire Les Déclencheurs (Triggers) DANS PL/SQL
  • 214. Séquence de déclenchement de Trigger Utilisez la séquence de déclenchement suivante pour un Trigger sur une table quand une seule ligne est manipulé: INSERT INTO departments (department_id,department_name, location_id) VALUES (400, 'CONSULTING', 2400); .… BEFORE avant le trigger tables BEFORE avant le trigger ligne AFTER Aprés le trigger ligne AFTER Aprésle trigger tables … … … Les Déclencheurs (Triggers) DANS PL/SQL
  • 215. UPDATE employees SET salary = salary * 1.1 WHERE department_id = 30; BEFORE avant le trigger tables AFTER (Aprés )le trigger tables BEFORE (avant) le trigger ligne AFTER (aprés) le trigger ligne BEFORE (avant) le trigger ligne AFTER (aprés) le trigger ligne …. …. Les Déclencheurs (Triggers) DANS PL/SQL
  • 216. Les types d’événement et le corps de triggers Événement de trigger : Determine quel Order DML va déclencher l’execution de trigger. Ils sont : INSERT UPDATE [OF column] DELETE Corps de triggers : Détermine l'action a effectuée Est-ce un bloc PL / SQL ou un appel à une procédure Les Déclencheurs (Triggers) DANS PL/SQL
  • 217. Application INSERT INTO EMPLOYEES...; table EMPLOYEES trigger SECURE_EMP CREATE OR REPLACE TRIGGER secure_emp BEFORE INSERT ON employees BEGIN IF (TO_CHAR(SYSDATE,'DY') IN ('DIM.','SAM.')) OR (TO_CHAR(SYSDATE,'HH24:MI') NOT BETWEEN '08:00' AND ‘18:00') then RAISE_APPLICATION_ERROR(-20500,'Vous ne pouvez inserer dans la table employes que durant les heures de travail'); END IF; END; Les Déclencheurs (Triggers) DANS PL/SQL Création d’un trigger pour sécurisé l’insertion dans la table employees