Documente Academic
Documente Profesional
Documente Cultură
Exemple :
Exercice 1
1. Sous SQL, crer une table nomme TEST_DBL contenant un seul attribut numrique. Ne pas
spcifier de cl primaire. Peupler cette table en incluant des doublons et des triplets.
2. crire un bloc PL/SQL anonyme permettant dafficher les valeurs prsentes au moins en double
dans la table TEST_DBL.
Exercice 2
On souhaite appliquer une rgle dchantillonnage la table DARMONT.EMP (Empno, Ename).
crire un programme PL/SQL (bloc PL/SQL anonyme) permettant de lire la table EMP et
dafficher les noms des employs dont les rangs dapparition dans la table sont : 1, 3, 6, 10, 15
1
2
3
4
5
Exercice 4 : Application
Rsultat attendu :
1 : SMITH
3 : WARD
6 : BLAKE
10 : TURNER
Indication : Utiliser un parcours personnalis de curseur dans lequel n-1 n-uplets sont lus avant
dafficher un nom demploy (n = 1, 2, 3 ; cest le nombre en italiques dans la rgle de calcul des
rangs).
Ne pas inclure de contrainte dintgrit dans la dfinition de ces deux relations, qui sont
temporaires et ne servent quau stockage des rsultats.
Exercice 3
Pour tenter dtablir une corrlation, on souhaite connatre la diffrence de quantit moyenne entre
les commandes successivement enregistres dans la table COMMANDE dune base de donnes
CLIENT-COMMANDE-PRODUIT. La table COMMANDE est remplie de commandes values
(cest--dire, pour lesquelles lattribut QUANTITE nest pas NULL) ou non. Les commandes non
values ne sont pas prendre en compte. crire un programme PL/SQL (bloc PL/SQL anonyme)
permettant de calculer la diffrence de quantit moyenne entre les commandes. Pour simplifier, on
BD et programmation TD n 2
4. Est-il possible dajouter une cl primaire la table TEST_DBL depuis un bloc PL/SQL ?
= 0
= 1
= 3
= 6
= 10
Indications :
1
3
6
10
15
QUANTITE
5
NULL
10
8
9
13
1/5
3) Dfinir un bloc PL/SQL anonyme permettant dinsrer dans RESULTAT tous les n-uplets
constitus du numro dun tudiant, de son nom, du code dune matire et de la note obtenue
par cet tudiant dans cette matire. Le calcul de cette note doit tenir compte des coefficients
de contrle continu et dexamen dfinis pour la matire en question, ainsi que de la
possibilit davoir des valeurs nulles pour les notes des tudiants, qui sont alors assimiles
BD et programmation TD n 2
2/5
0 (utiliser la fonction NVL). Les n-uplets considrs doivent tre extraits des tables
ETUDIANT, NOTATION et MATIERE de manire itrative, grce un curseur adapt.
4) Terminer le traitement en ralisant linsertion dans la relation CLASSEMENT des n-uplets
constitus du numro dun tudiant, de son nom, de son prnom, de la moyenne gnrale
obtenue dans toutes les matires par cet tudiant (ces informations doivent tre extraites de
la table RESULTAT) et de son rang (place), qui doit tre calcul. Pour simplifier, on
considre que toutes les matires sont quivalentes en termes de notes. Utiliser un curseur
dans lequel les enregistrements sont tris.
Questions complmentaires
Modifier le programme afin de prendre en compte :
le cas dtudiants nayant aucune note (par dfaut, leur moyenne gnrale est 0) ;
la possibilit de navoir aucun n-uplet dans la relation ETUDIANT. Dans ce cas, un n-uplet de
valeur (0, Aucun tudiant, NULL, NULL) doit tre insr dans la relation RESULTAT et le
traitement doit sarrter.
Correction
-- Ex. 1
DECLARE
CURSOR doublons IS SELECT dbl FROM test_dbl
GROUP BY dbl
HAVING COUNT(*)>1;
nuplet doublons%ROWTYPE;
BEGIN
DBMS_OUTPUT.PUT_LINE('Valeurs en double dans TEST_DBL :');
FOR nuplet IN doublons LOOP
DBMS_OUTPUT.PUT_LINE(nuplet.dbl);
DELETE FROM test_dbl WHERE dbl=nuplet.dbl;
INSERT INTO test_dbl VALUES (nuplet.dbl);
END LOOP;
DBMS_OUTPUT.PUT_LINE('Doublons supprims !');
--ALTER TABLE test_dbl ADD CONSTRAINT test_dbl_pri PRIMARY KEY(dbl);
--Ne fonctionne pas
END;
/
-- Ex. 2
DECLARE
CURSOR employes IS select ename from darmont.emp;
e employes%ROWTYPE;
i INTEGER;
n INTEGER := 1;
BEGIN
OPEN employes;
FETCH employes INTO e; -- 1er n-uplet
WHILE employes%FOUND LOOP
-- Lecture de n-1 n-uplets supplmentaires (on saute des lignes)
i := 1;
WHILE (i < n) AND (employes%FOUND) LOOP
FETCH employes INTO e;
i := i + 1;
END LOOP;
-- Affichage
IF employes%FOUND THEN -- Si on nest pas en fin de curseur
DBMS_OUTPUT.PUT_LINE(employes%ROWCOUNT || ' : ' || e.ename);
n := n + 1;
FETCH employes INTO e; -- N-uplet suivant
END IF;
END LOOP;
CLOSE employes;
END;
/
BD et programmation TD n 2
3/5
BD et programmation TD n 2
4/5
-- Ex. 3
DECLARE
CURSOR valuees IS
SELECT quantite FROM commande WHERE quantite IS NOT NULL;
cde valuees%ROWTYPE;
prec REAL; -- quantite precedente
cour REAL; -- quantite courante
cumul REAL;
moyenne REAL;
ncv INTEGER;
pas_assez EXCEPTION;
DECLARE
-- Calcul de la note globale par matiere
CURSOR etudiant_note IS
SELECT ETUDIANT.nume, nom, MATIERE.codemat,
((NVL(notecc, 0) * coefcc) + (NVL(notexam, 0) *coefexam)) /
(coefcc + coefexam) AS note
FROM ETUDIANT, NOTATION, MATIERE
WHERE ETUDIANT.nume = NOTATION.nume
AND NOTATION.codemat = MATIERE.codemat;
en etudiant_note%ROWTYPE;
nbe INTEGER;
-- Nombre d'etudiants a classer
rg INTEGER;
-- Place dans le classement general
moy NUMBER(5,2); -- Moyenne generale d'un etudiant
aucun_etudiant EXCEPTION;
BEGIN
-- Test nombre de commandes valuees
SELECT COUNT(*) INTO ncv FROM commande WHERE quantite IS NOT NULL;
IF ncv < 2 THEN
RAISE pas_assez;
END IF;
EXCEPTION
WHEN pas_assez THEN
RAISE_APPLICATION_ERROR(-20501,'Pas assez de commandes');
END;
/
-- Ex. 4
-- RESULTAT
BD et programmation TD n 2
5/5
BD et programmation TD n 2
6/5
BD et programmation TD n 2
7/5