Académique Documents
Professionnel Documents
Culture Documents
Examens corrigés
Module : Bases de données avancées
Professeur : M. MOUSSI
1
Université Mohamed 1er Année universitaire : 2014/2015
Faculté des Sciences Filière SMI, semestre 6.
Département de Mathématiques
et Informatique
2. Pour les déclarations des variables suivantes déterminer, avec justification, celles qui
sont correctes et celles qui sont incorrectes :
Déclaration Correcte/ incorrecte Justification
DECLARE
V1 VARCHAR2(4) ;
DECLARE
Var1, var2, var3 NUMBER(2) ;
DECLARE
Variable$ BOOLEAN ;
DECLARE
2emeVar DATE ;
DECLARE
Var_N NUMBER(4,1):=15.43 ;
DECLARE
Variable varchar2(4):=23ab ;
Exercice 1.
Ecrire en langage PL/SQL une procédure qui prend en paramètre un entier et affiche si
cet entier est glouton ou non.
On dit qu’un entier est ″glouton″ s’il possède strictement plus de diviseurs que
chacun des nombres inférieurs à lui. (Exemples : 12 est glouton ; 15 n’est pas glouton).
Exercice 2.
On considère le schéma relationnel suivant :
etudiant (NE, Nom, Adresse, Ville)
matiere (NM, Nom, Coefficient, type)
evaluation (NE, NM, DateEval, Note)
Ecrire un programme PL/SQL qui permet de Saisir un certain numéro de matière et vérifie si
toutes les notes obtenues dans cette matière (par tous les étudiants) est inférieur à 10 alors le
champ type de la table matiere sera mise à ‘not_easy’, sinon il sera mise à ‘easy’.
2
Solution Examen ordinaire 2014/2015
Questions de cours :
Voir le cours
Exercice 1.
create or replace procedure glouton(n in number )
is
begin
declare
ng number:=0;
nd number;
r boolean:=true;
begin
--calcul du nombre de diviseur de n
for i in 1..n loop
if mod(n,i)=0 then
ng:=ng+1;
end if;
end loop;
--calcul du nombre de diviseur de chaque entier
for p in 1..n loop
nd:=0;
for i in 1..p loop
if mod(p,i)=0 then
nd:=nd+1;
end if;
if nd>ng then
r:=false;
exit;
end if;
end loop;
end loop;
if r=false then
dbms_output.put_line('non gloutton');
else
dbms_output.put_line('gloutton');
end if;
end;
end;
3
Exercice 2:
accept numero
declare
num matiere.nm%type:=№
note_et evaluation.note%type;
--nombre des lingnes inf. a 10
n number:=0 ;
--nombre total des lignes
nt number:=0;
cursor c_note is
select note from evaluation
where nm=num;
begin
for c in c_note loop
nt:=nt+1;
if c.note<10 then
n:=n+1;
end if;
end loop;
dbms_output.put_line('le nombre total est' || nt);
dbms_output.put_line('le nombre est' || n);
--toutes les notes sont inferieurs à 10
if nt=n then
update matiere
set type='not_easy'
where
nm=№
else
update matiere
set type='easy'
where
nm=№
end if;
end;
4
Université Mohamed 1er Année universitaire : 2014/2015
Faculté des Sciences Filière SMI, semestre 6.
Département de Mathématiques
et Informatique
Questions de cours :
3. Donner la syntaxe générale pour créer une vue.
4. Quelle est l’utilité de la commande WITH CHECK OPTION?
5. Quel est l’effet de suppression d’une vue sur les tables référencées.
Exercice 1.
Ecrire en langage PL/SQL une procédure qui prend en paramètre un entier et affiche si
cet entier est square-free ou non.
On dit qu’un entier positif n est ″square-free″ si pour tous les nombres premiers p
le carré de p (p2) ne divise pas n. (Exemple : 10 est square-free, 18 n’est pas square-
free puisqu’il est divisible par 32).
Exercice 2.
On considère le schéma relationnel suivant :
etudiant (NE, Nom, Adresse, Ville)
matiere (NM, Nom, Coefficient, état)
evaluation (NE, NM, DateEval, Note)
Ecrire un programme PL/SQL qui lit un certain nom de matière et une date, puis vérifie
si aucune évaluation n’a eu lieu dans cette matière après cette date alors la matière
sera supprimée de la table matière,
sinon la valeur de l’état de la matière sera mise à « ok ».
5
Solution Examen rattrapage 2014/2015
Questions de cours :
Voir le cours
Exercice 1.
create or replace procedure squarefree(n in number )
is
begin
declare
ng number:=0;--nombre de diviseur premiers en carré
np number:=0;
nd number;
-- r boolean:=true;
begin
--calcul du nombre de diviseur en double des premiers de n
for i in 2..n loop
--je cherche s’il est premier
for j in 2..i-1 loop
if mod(i,j)=0 then
np:=np+1;
end if;
end loop;
if np = 0 then
--je cherche si ce premier est divisible en carré
if mod(n,i*i)=0 then
-- r:=false;
--exit
ng:=ng+1;
end if;
end if;
end loop;
if ng > 0 then
dbms_output.put_line(ng || 'non squarefree');
else
dbms_output.put_line(ng || 'squarefree');
end if;
end;
end;
Exercice 2.
accept nom
accept date_ev
DECLARE
n number:=0;
excep1 EXCEPTION;
excep2 EXCEPTION;
CURSOR curs_ev is
select dateEval
6
from evaluation e, matiere m
where e.NM=m.NM
and m.Nom='&nom'
and e.dateEval > &date_ev;
BEGIN
--ou bien utiliser curs_ev%rowcount c'est à dire
-- open curs_ev;
--dbms_output.put_line(curs_ev%rowcount);
--close curs_ev;
for c in curs_ev loop
exit when curs_ev%notfound;
n:=n+1;
end loop;
dbms_output.put_line('le nombre est' || n);
if n=0 then raise excep1;
else raise excep2;
end if;
EXCEPTION
when excep1 then
delete from matiere
where
nom='&nom';
when excep2 then
update matiere
set etat='ok'
where
nom='&nom';
END;
7
Université Mohamed 1er Année universitaire : 2015/2016
Faculté des Sciences Filière SMI, semestre 6.
Département d’Informatique
Questions de cours :
Soit la vue vue_etud (Nom, Adresse) sur la table Etudiant (NE clé primaire de type
entier, Nom de type char(10), Adresse de type char(30)).
1) Donner la syntaxe de création de la vue vue_etud.
2) Est-il possible d’insérer des données à travers la cette vue ?
La réponse doit être Justifiée.
3) Donner la commande permettant d’attribuer le privilège de sélection sur vue_etud.
Exercice 1.
1) Ecrire une fonction en langage PL/SQL nommée test_parfait qui prend en paramètre
un entier n et teste si cet entier est parfait ou non.
2) En utilisant la fonction test_parfait, écrire un programme PL/SQL qui lit un entier m et
affiche les nombres parfaits inférieurs à cet entier.
N. B. Un nombre est dit parfait s’il est égal à la somme de ses diviseurs propres.
(Exemple : le nombre 6 est parfait, 6=1+2+3)
Exercice 2.
On considère le schéma relationnel suivant :
etudiant (NE, Nom_et, Adresse, Ville)
matiere (NM, Nom_mat, Coefficient, type)
evaluation (NE, NM, DateEval, Note)
meilleurs (NM, Nom_et, note)
Ecrire un programme qui permet de
1) Saisir un entier n et un numéro de matière.
2) Récupérer le nom et la note des n meilleurs étudiants selon leurs notes dans cette
matière.
3) Enregistrer le numéro de la matière, les noms des étudiants et leurs notes dans la table
meilleurs.
N.B : Le programme doit utiliser les curseurs.
8
Solution examen ordinaire 2015/2016
Questions de cours :
Voir le cours
Exercice 1.
1) CREATE OR REPLACE FUNCTION test_parfait( n in number )
RETURN BOOLEAN
AS
BEGIN
DECLARE
S number:= 0;
R BOOLEAN:= FALSE;
BEGIN
FOR i IN 1..n-1 loop
IF MOD(n,i)=0 THEN
S:=S+i;
END IF;
END LOOP;
IF S=n THEN
R:= TRUE;
END IF;
RETURN R;
END;
END;
/
2) ACCEPT m
BEGIN
FOR i IN 1..&m loop
IF test_parfait(i)=TRUE THEN
DBMS_OUTPUT.PUT_LINE(i);
END IF;
END LOOP;
END;
/
Exercice 2.
ACCEPT n
ACCEPT num_mat
DECLARE
lg_meil meilleurs%ROWTYPE ;
CURSOR meil_curseur IS
SELECT v.NM, e.nom_et, v.note
FROM etudiant e, evaluation v
WHERE
v.NE=e.NE
and v.NM=&num_mat
9
OEDER BY v.note DESC;
BEGIN
OPEN meil_curseur;
FOR i IN 1..&n LOOP
FETCH meil_curseur INTO lg_meil;
INSERT INTO meilleurs VALUES (lg_meil.NM, lg_meil.Nom_et, lg_meil.note ) ;
END LOOP ;
CLOSE meil_curseur ;
END ;
/
10
Université Mohamed 1er Année universitaire : 2015/2016
Faculté des Sciences Filière SMI, semestre 6.
Département d’Informatique
Questions de cours :
1) Pour les déclarations des variables suivantes en PL/SQL déterminer, avec justification,
celles qui sont correctes et celles qui sont incorrectes :
Exercice 1.
Deux nombres entiers n et m sont dits amicaux si la somme des diviseurs de n (n non
compris) est égale à m et la somme des diviseurs de m (m non compris) est égale à n.
(Exemple : 220 et 284 sont amicaux)
1) Ecrire une fonction nommée fct_ami qui prend en paramètre deux entiers n et m et
retourne une valeur booléenne selon qu’ils sont amicaux ou non.
2) En utilisant la fonction fct_ami, écrire un programme PL/SQL qui lit deux entiers N
et M et affiche un message selon qu’ils sont amicaux ou non.
11
Exercice 2.
On considère le schéma relationnel suivant :
etudiant (NE, Nom_et, Adresse, Ville)
matiere (NM, Nom_mat, Coefficient, type)
evaluation (#NE,# NM, DateEval, Note)
Ecrire un bloc PL/ SQL qui permet de lire un entier n et un certain numéro de matière et qui
vérifie :
Si le nombre des étudiants ayant obtenu la note la plus haute ou bien la note la plus
basse est inférieur à n alors le programme affiche les noms de ces étudiants.
Sinon le programme affiche le message « le nombre des étudiants est supérieur à n »
12
Solution examen rattrapage 2015/2016
Exercice 1.
1)
CREATE OR REPLACE FUNCTION fct_ami( n in number, m in number )
RETURN BOOLEAN
AS
BEGIN
DECLARE
S1 number:= 0;
S2 number:= 0;
R BOOLEAN:= FALSE;
BEGIN
FOR i IN 1..n-1 loop
IF MOD(n,i)=0 THEN
S1:=S1+i;
END IF;
END LOOP;
FOR i IN 1..m-1 loop
IF MOD(m,i)=0 THEN
S2:=S2+i;
END IF;
END LOOP;
DECLARE
R BOOLEAN;
BEGIN
R:=fct_ami(&N,&M);
IF R=TRUE THEN
DBMS_OUTPUT.PUT_LINE(‘les deux entiers sont amicaux’);
ELSE
DBMS_OUTPUT.PUT_LINE(‘les deux entiers ne sont pas amicaux’);
END IF;
END;
/
13
Exercice 2.
--saisie des valeurs
ACCEPT n
ACCEPT num_mat
DECLARE
nb_max number;
nb_min number;
except exception;
CURSOR liste_etudiant is
select a.Nom
from etudiant a join evaluation b on a.NE=b.NE
where
b.Note=(select max(Note) from evaluation where b.nm= &num_mat)
or b.Note=(select min(Note) from evaluation where b.nm= &num_mat)
and
nm=&num_mat;
BEGIN
--récupérer le nombre des étudiants ayant obtenu la note max dans la matiere num_mat
select count(ne) as "nombre ayant max" into nb_max from evaluation
where
note=(select max(note) from evaluation where nm=&num_mat)
and nm=&num_mat;
--récupérer le nombre des étudiants ayant obtenu la note min dans la matiere num_mat
select count(ne) as "nombre ayant min" into nb_min
from evaluation
where
note=(select min(note) from evaluation where nm=&num_mat)
and nm=&num_mat;
--si l’un des deux nombres <=n j’affiche la liste des étudiant
IF nb_max <= &n or nb_min<=&n THEN
FOR c IN liste_etudiant
LOOP
DBMS_OUTPUT.PUT_LINE(c.nom) ;
END LOOP ;
-- sinon je déclenche l’exception qui contient le message
ELSE RAISE except;
END IF;
EXCEPTION
WHEN except THEN
DBMS_OUTPUT.PUT_LINE(‘le nombre est superieur’) ;
END ;
/
14
Université Mohamed 1er Année universitaire : 2016/2017
Faculté des Sciences Filière SMI, semestre 6.
Département d’Informatique
Exercice 3.
Ecrire un programme PL/SQL qui permet de
Saisir un entier n,
Calculer et afficher le nombre des diviseurs de n.
15
Solution Examen ordinaire 2016/2017
Exercice 2.
accept numero
DECLARE
nombre NUMBER;
nombre_mat NUMBER ;
--nom_et etudiant.nom%TYPE;
--etud etudiant%rowtype;
BEGIN
--je cherche si l’etudiant existe
SELECT count(*) into nombre FROM etudiant
WHERE NE=№
if nombre>0 then
--DBMS_OUTPUT.PUT_LINE('existe');
--je calcule le nombre des matieres avec note <10
select count(b.NM) into nombre_mat
from evaluation
where Note<10
and NE=№
if n=0 then
--DBMS_OUTPUT.PUT_LINE('toutes les notes sont >= 10');
Update etudiant
Set resultat=’ok’
Where NE=&numero ;
Else
--DBMS_OUTPUT.PUT_LINE( 'on a des notes <');
Update etudiant
Set resultat= 'non ok'
Where NE=&numero ;
end if ;
else
DBMS_OUTPUT.PUT_LINE('n existe pas');
end if;
end;
Exercice 3.
accept n
declare
nd number:=0;--nombre des diviseurs
m number:=&n;
begin
--calcul du nombre de diviseurs de n
for i in 1..&n loop
if mod(m,i)=0 then
nd:=nd+1;
16
end if;
end loop;
dbms_output.put_line(nd);
end;
17
Université Mohamed 1er Année universitaire : 2016/2017
Faculté des Sciences Filière SMI, semestre 6.
Département d’Informatique
Exercice 1.
Soit la table ″Personne″ et le programme PL/SQL suivants :
Num Nom Age Ville
1 Ahmed 20 Oujda
2 Aicha 23 Casa
3 Mohammed 30 Rabat
4 Zakaria 15 Oujda
18
Exercice 2.
On considère le schéma relationnel suivant :
etudiant (NE, Nom_et, Adresse, Ville, resultat)
matiere (NM, Nom_mat, Coefficient, type)
evaluation (NE, NM, DateEval, Note)
Exercice 3.
Un entier naturel strictement supérieur à 1 est dit hautement composé lorsqu’il possède
strictement plus de diviseurs que n’importe quel entier qui le précède.
Exemple :
Les nombres hautement composés inférieurs ou égaux à 100 sont : 2, 4, 6, 12, 24, 36, 48 et
60 (par exemple : 6 possède strictement plus de diviseurs que 2, 3, 4 et 5).
Question :
Ecrire un programme PL/SQL qui permet de saisir un entier n et d’afficher les entiers
inférieurs à n qui sont hautement composés.
19
Solution de l’examen rattrapage 2016/2017
Exercice 1.
Soit la table ″Personne″ et le programme PL/SQL suivants :
Num Nom Age Ville
1 Ahmed 20 Oujda
2 Aicha 23 Casa
3 Mohammed 30 Rabat
4 Zakaria 15 Oujda
IF n=0 THEN
DBMS_OUTPUT.PUT_LINE('le premier cas');
ELSIF n=1 THEN
DBMS_OUTPUT.PUT_LINE('le deuxieme cas');
i:=n+1;
ELSIF n=2 THEN
DBMS_OUTPUT.PUT_LINE('le trois cas');
ELSE – pas de THEN
DBMS_OUTPUT.PUT_LINE('le quatr cas');
i:=n+2;
END IF;
RETURN i ;
END;
Exercice 2.
On considère le schéma relationnel suivant :
etudiant (NE, Nom_et, Adresse, Ville, resultat)
matiere (NM, Nom_mat, Coefficient, type)
evaluation (NE, NM, DateEval, Note)
20
DECLARE
nombre NUMBER;
moy NUMBER;
nombre_mat NUMBER ;
BEGIN
--je cherche si l’etudiant a ete evalué
SELECT count(*) into nombre FROM evaluation
WHERE NE=№
if nombre>0 then
DBMS_OUTPUT.PUT_LINE('evalué');
--je calcule la moyenne
select
(sum(b.Note*c.Coefficient))/sum(c.Coefficient) into moy
from etudiant a,evaluation b,matiere c
where a.NE=b.NE
and b.NM=c.NM
and b.NE=&numero
group by a.NE;
if moy>=10 then
DBMS_OUTPUT.PUT_LINE('la moyenne et sup. ou eg. a 10');
Update evaluation
Set Note=Note+1
Where NE=&numero ;
Else
DBMS_OUTPUT.PUT_LINE( 'la moyenne est inf. a 10');
Update evaluation
Set Note=Note+2
Where NE=&numero ;
end if ;
ELSE
DBMS_OUTPUT.PUT_LINE('non evalue');
end if;
end;
Exercice 3.
Un entier naturel strictement supérieur à 1 est dit hautement composé lorsqu’il possède
strictement plus de diviseurs que n’importe quel entier qui le précède.
Exemple :
Les nombres hautement composés inférieurs ou égaux à 100 sont : 2, 4, 6, 12, 24, 36, 48 et
60.
accept n
declare
k number:=1;
nb number ;
n number;
begin
21
for i in 2..&n loop
--je cherche hautement
-- debut calcul nombre div
nb:=0;
for j in 1..i loop
if mod(i,j)=0 then
nb:=nb+1;
end if;
end loop;
--fin calcul nombre div
--comparer le nombre div avec k, k est nombre div ancien
if(nb>k) then
DBMS_OUTPUT.PUT_LiNE(i || ' ' || nb || 'est hautement');
DBMS_OUTPUT.PUT_LiNE(k);
end if;
if nb>k then k:=nb;
end if;
end loop;
end;
22
Université Mohamed 1er Année universitaire : 2017/2018
Faculté des Sciences Filière SMI, semestre 6.
Département d’Informatique
Exercice 1.
Soit le programme PL/SQL suivant :
declare
n number;
m number:=1;
begin
n:='aaa';
m:=m+2;
dbms_output.put_line(m);
dbms_output.put_line(n);
end;
1) Donner avec justification le résultat d’exécution de ce programme.
2) En utilisant l'instruction when others et en supprimant la partie en gras, modifier
le programme pour qu'il affiche le message 'vous avez deux affectations… !';
Exercice 2.
Donner en langage SQL les requêtes permettant (sous Oracle) de :
1) Créer un utilisateur nommé user1 en lui affectant le tablespace system par
défaut et tablespace temp comme tablespace temporaire.
2) Donner le privilège de connexion à la base de données pour user1.
3) Donner le privilège de création de table dans tous les schémas à user1.
4) Donner le privilège de consultation de la table evaluation à user1 avec l’option
qui lui permet de donner ce privilège à un autre utilisateur.
Exercice 3.
Ecrire un programme PL/SQL qui permet de :
Saisir un entier n.
Si n est supérieur ou égal au nombre de lignes de la table matière alors le
programme affiche toutes les lignes de la table matière.
Sinon le programme affiche les n premières lignes de la table matière.
23
Exercice 4.
Un entier naturel (différent de 1) est dit premier s’il possède exactement deux
diviseurs distincts positifs (1 et lui-même).
1) Ecrire, en langage PL/SQL, une procédure nommé prcd_premier qui prend en
paramètre un entier n,
si n est premier, la procédure affiche le message ‘n est premier’ et
affiche aussi son ordre (ordre signifie le 1er, le 2ème, le 3ème …etc).
sinon, elle affiche le message ‘n n’est pas premier’.
2) Donner l’instruction qui permet d’exécuter la procédure prcd_premier sous
SQL/Plus pour n=5.
Exemple : n=2 est le premier entier premier, n=3 est le deuxième entier premier
n=5 est le troisième entier premier…
Exercice 3.
accept n
declare
nb number;
ma_matiere matiere%rowtype;
cursor curs is select * from matiere;
begin
select count(*) into nb from matiere;
open curs;
if &n>=nb then
loop
fetch curs into ma_matiere;
dbms_output.put_line(ma_matiere.nm || ' ' || ma_matiere.nom || ' '
||ma_matiere.coefficient || ' ' || ma_matiere.type);
exit when curs%notfound;
end loop;
else
for i in 1..&n loop
fetch curs into ma_matiere;
dbms_output.put_line(ma_matiere.nm || ' ' || ma_matiere.nom_mat);
exit when curs%notfound;
end loop;
end if;
close curs;
end;
24
Exercice 4.
1)
create or replace procedure prcd_premier(n in number)
is
begin
declare
p number:=1;
begin
for i in 2..n-1 loop
if mod(n,i)=0 then p:=0;
end if;
end loop;
if p=1 then
dbms_output.put_line(n || 'est premier');
else
dbms_output.put_line(n || 'n est pas premier');
end if;
end;
end;
2)
Execute prcd_premier(5) ;
25
Université Mohamed 1er Année universitaire : 2017/2018
Faculté des Sciences Filière SMI, semestre 6.
Département d’Informatique
Exercice 1.
1) Donner une définition du curseur (en PL/SQL).
2) Quelle est la différence entre un curseur explicite et un curseur implicite.
3) Compléter le tableau suivant par les ordres SQL qu’on peut associer à chaque type
de curseur.
Exercice 2.
1) Donner en langage SQL les requêtes permettant (sous Oracle) de Créer une vue
nommée moy_vue sur les noms et les moyennes des étudiants.
2) Est-il possible d’insérer des données à travers la vue moy_vue ? justifier.
3) Donner la syntaxe générale de compilation d’une vue.
4) Qu’elle est l’utilité de l’option FORCE VIEW ?
Exercice 3.
Deux nombres entiers premiers n et m sont dits jumeaux si leur différence est égale à
la valeur 2. (Exemple : 3 et 5 ; 5 et 7 ; 11 et 13 ; 29 et 31).
3) Ecrire une fonction nommée fct_jum qui prend en paramètre deux entiers n et m et
retourne une valeur booléenne selon qu’ils sont jumeaux ou non.
Rappel : Un entier naturel (différent de 1) est dit premier s’il possède exactement
deux diviseurs distincts positifs (1 et lui-même).
26
Exercice 4.
Ecrire un programme PL/SQL qui permet de saisir un certain numéro d’étudiant et vérifie :
Si n_haute et n_basse sont égaux alors le programme affiche Liste_matiere.
Sinon, le programme affiche le massage ‘nombres differents’.
Avec :
n_haute = le nombre des matières dans lesquelles l’étudiant saisit a obtenu la note la plus
haute.
n_basse = le nombre des matières dans lesquelles l’étudiant saisit a obtenu la note la plus
basse.
Liste_matiere= les noms des matières dans lesquelles l’étudiant saisit a obtenu la note
la plus haute ou bien la note la plus basse.
27
Solution examen rattrapage 2017/2018
Exercice 3.
28
Exercice 4.
--saisie des valeurs
ACCEPT num_et
DECLARE
n_haute number;
n_basse number;
--except exception;
CURSOR liste_matiere is
select a.nom_mat
from matiere a join evaluation b on a.NM=b.NM
where
b.Note=(select max(Note) from evaluation where b.NE= &num_et)
or b.Note=(select min(Note) from evaluation where b.NE= &num_et)
and
NE=&num_et;
BEGIN
--récupérer le nombre des matières dans lesquelles l’étudiant a obtenu la note la plus haute
select count(NM) as "nombre matiere haute" into n_haute from evaluation
where
note=(select max(note) from evaluation where NE=&num_et)
and NE=&num_et;
--récupérer le nombre des matières dans lesquelles l’étudiant a obtenu la note la plus basse
select count(NM) as "nombre ayant min" into n_basse
from evaluation
where
note=(select min(note) from evaluation where NE=&num_et)
and NE=&num_et;
--si les deux nombres sont égaux j’affiche la liste des matières
IF n_haute = n_basse THEN
FOR c IN liste_matiere
LOOP
DBMS_OUTPUT.PUT_LINE(c.nom_mat) ;
END LOOP ;
-- sinon j’affiche le message
ELSE
DBMS_OUTPUT.PUT_LINE ( 'nombre differents' ) ;
END IF;
END ;
29
Université Mohamed 1er Année universitaire : 2018/2019
Faculté des Sciences Filière SMI, semestre 6.
Département d’Informatique
Exercice1.
Soient la suite des opérations, avec questions, suivantes :
1) Se connecter en utilisant SCOTT et créer un utilisateur USER1,
Question : Donner la syntaxe de création de USER1.
2) Attribuer les privilèges de connexion à la base de données et de création des
tables à l’utilisateur USER1.
Question : Donner la syntaxe de ces deux privilèges.
3) Se connecter en utilisant USER1 et créer la table etudiant avec l’extension :
30
Exercice2.
Ecrire une fonction nommée moy_abs qui prend en paramètres deux entiers a et b et
retourne la moyenne des valeurs absolues des entiers allant de a à b.
N.B. le programme ne doit pas utiliser la fonction ABS (la fonction valeur absolue).
Exemple.
Moy_abs(-2, 3)= (|-2|+|-1|+|0|+|1|+|2|+|3|)/6
= (2+1+0+1+2+3)/6
=1,5
Exercice3.
Écrire un bloc PL/SQL qui permet de Saisir un certain numéro d’étudiant,
Si cet étudiant a été évalué au moins une fois, calculer sa moyenne
générale, sans utilisation des fonctions d’agrégats.
Sinon, afficher le message ‘aucune évaluation’.
Indications :
La moyenne générale est donnée par : ∑note*coefficient / ∑coefficient
Créer un curseur contenant les notes et les coefficients.
A l’aide d’un parcours du curseur, cumuler le coefficient et la note
multipliée par le coefficient.
Exception : si la table ne contient aucune évaluation de l’étudiant, alors
le programme sera interrompu.
31
Exercice2.
declare
s number:=0;
n number:=0;
m number;
begin
for i in a..b loop
n:=n+1;
if i>0 then
s:=s+i;
else
s:=s+(-i);
end if;
end loop;
m:=s/n;
return m;
end;
end;
32
Exercice3
accept num
declare
s number:=0;
s_coeff number:=0;
m number;
n number;
p_note evaluation.note%type;
p_coeff matiere.coefficient%type;
cursor curseur is
select e.note, m.coefficient
from evaluation e, matiere m
where e.nm=m.nm
and e.ne=#
aucune_eval exception;
begin
select count(NE) into n from evaluation
where NE=#
if n<1 then raise aucune_eval;
else
open curseur;
loop
fetch curseur into p_note, p_coeff;
end loop;
m:=s/s_coeff;
dbms_output.put_line('somme est ' || s);
dbms_output.put_line('somme coeff est ' || s_coeff);
dbms_output.put_line('moyenne est ' || m);
close curseur;
end if;
exception
when aucune_eval then
dbms_output.put_line('aucune evaluation');
end;
33
Université Mohamed 1er Année universitaire : 2018/2019
Faculté des Sciences Filière SMI, semestre 6.
Département d’Informatique
Exercice1.
On considère la table Etudiant avec l’extension
declare
n,m number;
msg varchar(10);
begin
update etudiant
set ville='any'
where age>20;
m:=1;
n:=sql%rowcount;
IF n==0 THEN
msg:='zero' ;
ELSEIF n==1 THEN
msg:='un' ;
ELSEIF n==2 THEN
msg:='deux' ;
ELSE
msg:='autre' ;
end if;
dbms_output.put_line(msg);
dbms_output.put_line(m);
end;
34
Exercice2
Un entier naturel (différent de 1) est dit premier s’il possède exactement deux
diviseurs distincts positifs, 1 et lui-même.
1) Ecrire une fonction nommée nombre_premier qui prend en paramètre un entier
n et retourne le nombre des entiers premiers qui sont inférieurs ou égaux à n.
2) Donner l’instruction d’exécution de la fonction nombre_premier pour n=10.
Exercice3
Ecrire un programme qui permet de saisir un entier n et un numéro de matière :
1) Si le nombre des évaluations dans cette matière est inférieur à n, le programme
affiche le message ‘matière non évaluée’.
2) Sinon, Récupérer le nom et la note des n derniers étudiants selon leurs notes
dans cette matière et les afficher avec le numéro de la matière.
35
Exercice2.
1)
create or replace function nombre_premier(n in number)
return number
is
begin
declare
p number;
s number:=0;---nombre des nombres premiers
m number;
begin
m:=2;
loop---repeter de 2 jusqu’a la valeur de m
p:=1;----boucle qui teste si m est premier ou non
for i in 2..m-1 loop
if mod(m,i)=0 then p:=0;
end if;
end loop;
if p=1 then
s:=s+1;
end if;
m:=m+1;
exit when m>n;
end loop;
return s;
end;
end;
36
Exercice3.
ACCEPT n
ACCEPT num_mat
DECLARE
m number:=&n;
c_nm evaluation.NM%type;
c_nom etudiant.nom%type;
c_note evaluation.note%type;
excep exception;
nb number;--nombre des evaluations
CURSOR dern_curseur IS
SELECT v.NM, e.nom, v.note
FROM etudiant e, evaluation v
WHERE
v.NE=e.NE
and v.NM=&num_mat
ORDER BY v.note Asc;
BEGIN
select count(*) into nb ---le nombre des evaluations
from evaluation
where NM=&num_mat;
if nb<m then ---tester si le nombre des evaluations est inferieur à n
raise excep;
else
OPEN dern_curseur;
FOR i IN 1..&n LOOP
FETCH dern_curseur INTO c_nm, c_nom,c_note;
dbms_output.put_line(c_nm || ' ' || c_nom || '' || c_note);
END LOOP ;
CLOSE dern_curseur ;
end if;
EXCEPTION
when excep then
dbms_output.put_line('matiere non evaluée');
END ;
/
37
Université Mohamed 1er Année universitaire : 2020/2021
Faculté des Sciences Filière SMI, semestre 6.
Département d’Informatique
I)
Sous SQLPLUS, vous êtes connectés avec le compte user1.
5) Est-t-il possible de créer une table dans le schéma de l’utilisateur user3 (un autre
utilisateur) ? justifier.
II)
1) Donner la syntaxe de création d’une vue, nommée vue_coefficient, sur tous les
attributs des matières qui ont un coefficient supérieur ou égal à la valeur 4.
2) A travers la vue vue_coefficient, est-t-il possible de :
a. Insérer la ligne (‘Mat1’, ‘informatique’,2).
b. Insérer la ligne (‘Mat2’, ‘projet’,6).
c. Modifier la ligne (‘Mat1’, ‘informatique’,2).
d. Modifier la ligne (‘Mat2’, ‘projet’,6).
3)
a. Donner la commande SQL permettant d’ajouter une colonne nommée
nobre_heure de type NUMBER à la table matière.
b. Quelle est l’effet de la commande de la question a. sur la vue vue_coefficient ?
c. Comment compiler la vue vue_coefficient ?
d. Après compilation quelle est la nouvelle structure de la vue vue_coefficient ?
38
III) Soit l’extension de la table matiere :
NM Nom Coefficient
Mat1 Mathématiques 4
Mat2 Physique 3
Mat3 Langue 2
ACCEPT c
DECLARE
n , m number ;
BEGIN
m :=0;
SELECT COUNT(coefficient) INTO n FROM matiere;
WHERE coefficeint > c
IF n==1 THEN
DBMS_OUTPUT.PUT_LINE('un') ;
ELSEIF n==2 THEN
DBMS_OUTPUT.PUT_LINE('deux') ;
m:=n+1;
ELSEIF n==3 THEN
DBMS_OUTPUT.PUT_LINE(' trois') ;
ELSE THEN
DBMS_OUTPUT.PUT_LINE('autre') ;
m:=n+2 ;
END IF ;
DBMS_OUTPUT.PUT_LINE(m) ;
END ;
I)
Voir cours.
39
II)
Voir cours
I)
Sous SQLPLUS, vous êtes connectés avec le compte user1.
II)
1) Donner la syntaxe de création d’une vue, nommée vue_coefficient, sur les noms et les
Coefficients des matières qui ont un coefficient supérieur ou égal à la valeur 4.
2) A travers la vue vue_coefficient, est-t-il possible de :
a. Insérer la ligne (‘informatique’,2).
b. Insérer la ligne ( ‘projet’,6).
3) Que signifie l’option FORCE VIEW dans la syntaxe de création d’une vue.
4) Donner la commande permettant d’attribuer le privilège de sélection sur la vue
vue_coefficient.
III)
Ecrire un programme PL/SQL qui permet de
40
1) Saisir un certain numéro de matière nommé n.
2) Si cette matière n’existe pas, le programme affiche le message ″n’existe pas″ et
l’insère (avec : NM= n, Nom_mat= ‘info’, Coefficient=3).
3) Si cette matière existe alors :
a. Si son coefficient est supérieur ou égale à 3, le programme affiche le message :
″existe avec coefficient supérieur à 3″.
b. Sinon le programme affiche le message : ″existe avec coefficient inférieur à 3″.
I) Voir cours.
III)
Ecrire un programme PL/SQL qui permet de
1) Saisir un certain numéro de matière nommé n.
2) Si cette matière n’existe pas, le programme affiche le message ″n’existe pas″ et
l’insère (avec : NM= n, Nom_mat= ‘info’, Coefficient=3).
3) Si cette matière existe alors :
a. Si son coefficient est supérieur ou égale à 3, le programme affiche le message :
″existe avec coefficient supérieur à 3″.
b. Sinon le programme affiche le message : ″existe avec coefficient inférieur à 3″.
accept numero
DECLARE
nombre NUMBER;
nombre_mat NUMBER ;
--nom_et etudiant.nom%TYPE;
--etud etudiant%rowtype;
BEGIN
--je cherche si l’etudiant existe
SELECT count(*) into nombre FROM etudiant
WHERE NE=№
if nombre>0 then
--DBMS_OUTPUT.PUT_LINE('existe');
--je calcule le nombre des matieres avec note <10
select count(b.NM) into nombre_mat
from evaluation
where Note<10
and NE=№
if n=0 then
--DBMS_OUTPUT.PUT_LINE('toutes les notes sont >= 10');
41
Update etudiant
Set resultat=’ok’
Where NE=&numero ;
Else
--DBMS_OUTPUT.PUT_LINE( 'on a des notes <');
Update etudiant
Set resultat= 'non ok'
Where NE=&numero ;
end if ;
else
DBMS_OUTPUT.PUT_LINE('n existe pas');
end if;
end;
Exercice 2.
On considère le schéma relationnel suivant :
etudiant (NE, Nom, Adresse, Ville)
matiere (NM, Nom, Coefficient, état)
evaluation (NE, NM, DateEval, Note)
Ecrire un programme PL/SQL qui lit un certain nom de matière et une date, puis vérifie
si aucune évaluation n’a eu lieu dans cette matière après cette date alors la matière
sera supprimée de la table matière,
sinon la valeur de l’état de la matière sera mise à « ok ».
Exercice 2.
accept nom
accept date_ev
DECLARE
n number:=0;
excep1 EXCEPTION;
excep2 EXCEPTION;
CURSOR curs_ev is
select dateEval
from evaluation e, matiere m
where e.NM=m.NM
and m.Nom='&nom'
and e.dateEval > &date_ev;
BEGIN
--ou bien utiliser curs_ev%rowcount c'est à dire
-- open curs_ev;
--dbms_output.put_line(curs_ev%rowcount);
--close curs_ev;
for c in curs_ev loop
exit when curs_ev%notfound;
42
n:=n+1;
end loop;
dbms_output.put_line('le nombre est' || n);
if n=0 then raise excep1;
else raise excep2;
end if;
EXCEPTION
when excep1 then
delete from matiere
where
nom='&nom';
when excep2 then
update matiere
set etat='ok'
where
nom='&nom';
END;
43