TP2
PL/SQL - Introduction
Le TP est à rendre à la fin de la séance en version électronique dans le fichier [Link]
sur "campus".
Remarque
Pour attribuer à n une valeur aléatoire comprise entre 1 et 50, il faut écrire dans la partie
DECLARE :
x number(2):= dbms_random.value(1,500);
Pour lire n à partir du clavier, il faut écrire dans la partie DECLARE :
N NUMBER :=&N
Exercice 1 : Table de multiplication
Écrire un script qui lit un nombre n à partir du clavier et affiche à l'écran la table de multiplication
de ce nombre.
Exemple
Table de multiplication de 7 :
1 fois 7 = 7
2 fois 7 = 14
3 fois 7 = 21
4 fois 7 = 28
5 fois 7 = 35
6 fois 7 = 42
7 fois 7 = 49
8 fois 7 = 56
9 fois 7 = 63
Exercice 2 : La factorielle
Écrire un script qui lit un nombre n à partir du clavier, calcule la factorielle de ce nombre et affiche
à l'écran le résultat.
Exemple d’exécution :
La factorielle de 4 est 120
Exercice 3 : Exécution d’un bloc PL/SQL
Que fait ce bloc PL/SQL. La réponse doit être sous forme de commentaires dans le bloc.
DECLARE
x number :=&x;
D. Berrabah Bases de Données Avancées
1
y number :=&y;
z number :=1;
BEGIN
IF x < y THEN
FOR i IN 1..y LOOP
z := z * x;
END LOOP;
ELSIF x > y THEN
y := 1;
WHILE y <= x LOOP
z := z * y;
y := y + 1;
END LOOP;
ELSE z := x * y;
END IF;
DBMS_OUTPUT.PUT_LINE('La valeur de z est : '||z);
END;
/
Exercice 4 : Suite de fibonacci (3 points)
Écrire un script qui lit un nombre n à partir du clavier, calcule la suite de Fibonacci de ce nombre et
affiche à l'écran le résultat.
La définition de la suite étant la suivante :
- f(1) = 1
- f(2) = 1
- f(3) = 2
- f(4) = 3
- f(5) = 5
- …..
- f(n+2) = f(n+1) + f(n)
Exercice 5 : Nombres premiers
Donnez le bloc PL/SQL qui génère la liste des nombres premiers inférieurs à 100, les met dans un
tableau et les affiche à la fin.
Exercice 6 : Tri de tableaux
Donnez le bloc PL/SQL qui remplit un tableau par des valeurs aléatoires et ensuite trie ces valeurs
dans un ordre croissant. En fin, on affiche le contenu du tableau.
Exercice 7 : Palindrome
Il s'agit d'écrire un programme qui, étant donnée une chaîne de caractères
• calcule la chaîne inverse
• indique s'il s'agit ou non d'un palindrome
D. Berrabah Bases de Données Avancées
2
Exemples
• Si la commande est :
La chaine lue est bonjour
La réponse pourrait être :
L'inverse de bonjour est ruojnob
bonjour n'est pas un palindrome
• Si la commande est :
La chaine lue est laval
La réponse pourrait être
L'inverse de laval est laval
laval est un palindrome
On développe une fonction et une procédure stockées :
La fonction stockée, nommée inverse (st varchar2), retourne la chaîne inverse de la chaîne st.
La procédure stockée, nommée Palindrome, récupère la chaîne de caractère saisie par l’utilisateur,
calcule son inverse grâce à la fonction inverse, affiche cet inverse et indique si la chaîne est ou non
un palindrome.
Exercice 8 : Palindrome bis
Ecrire un bloc qui transforme une chaîne de caractères en un palindrome. Par exemple, « taratata »
sera transformée en « taratataatatarat ».
Exercice 9: Mastermind
Vous allez programmer une version modifiée du jeu « Mastermind » qui, dans la version de base,
consiste à deviner un « code secret » : une séquence ordonnée de plusieurs couleurs choisies parmi
un choix de couleurs différentes.
Dans cette variante, les couleurs seront remplacées par des entiers. Vous demanderez à l’ordinateur
de générer un code secret de longueur n et l’utilisateur (vous) devra le deviner. Il ne doit y avoir
qu’une seule occurrence de chaque chiffre dans le code secret.
Une tentative sera gagnante si le joueur identifie les entiers dans le bon ordre ; i.e. pour chaque
entier du code secret la valeur et la position sont correctes. Pour vous aider, l’ordinateur répondra à
vos propositions avec le code suivant :
• [a] avec a le nombre de chiffres avec la valeur correcte à la bonne position ;
• (b) avec b le nombre de chiffres dont la valeur est bonne mais pas la position.
Exemple :
Code secret 1 6 5 4 3
Essai du joueur 1 5 2 9 3
Vous devrez afficher : [2] (1)
Exercice 10 : Les booléens
Sans utiliser les operateurs logiques AND, OR, NOT etc., écrivez les quatre fonctions suivantes
dans un bloc :
D. Berrabah Bases de Données Avancées
3
• not_fonc( a) retourne la négation de a
• and_fonc (a,b) retourne la valeur logique de a et b
• or_fonc (a,b) retourne la valeur logique de a ou b
• xor_fonc(a,b) retourne la valeur logique de a xor b
Testez les quatre fonctions dans le programme principal. Bien évidemment il faut tester toutes les
possibilités …
Exercice 11 : Trouver l’erreur
Corriger ce bloc en commentant chaque ligne corrigée, ajoutée ou enlevée.
DECLARE
capacite number := &capacite;
BEGIN
SELECT capacite
FROM station
WHERE nomstation = 'futur station';
IF capacite < 500 THEN
RAISE capacite_trop_petite;
ELSE dbms_output.put_line('Séjour autorisé);
insert into sejour values(&idClient, &station, &debut, &fin, &nbPlaces);
EXCEPTION
WHEN capacite_trop_petite THEN
DBMS_OUTPUT.PUT_LINE( ' La station est trop petite !! ');
END;
/
Exercice 12 : Un peu de calcul
Ecrire un bloc qui lit une valeur en base 10 et renvoie à l’écran sa valeur en binaire, puis en octal et
enfin en hexadécimal.
Exercice 13 : Compter en sudoku
Le but de ce bloc est de réaliser un programme permettant de trouver la solution pour une grille de
sudoku. Vous êtes complètement libre dans vos choix d’implémentation.
Voici un exemple de grille avec une solution.
D. Berrabah Bases de Données Avancées
4
Grille de départ Une des solutions possible :
----------------------- -----------------------
|1 | | | |147|238|569|
|2 | | | |258|169|347|
|3 | | | |369|457|128|
----------------------- -----------------------
|4 | | | |471|382|695|
|5 | | | |582|691|473|
|6 | | | |693|574|281|
----------------------- -----------------------
|7 | | | |714|823|956|
|8 | | | |825|916|734|
|9 | | | |936|745|812|
----------------------- -----------------------
D. Berrabah Bases de Données Avancées
5