Vous êtes sur la page 1sur 4

TP5: BASE DE DONNEES AVANCEES (S3 :

2020/2021)
- Premiers pas en PL/SQL
- Bloc anonyme
- Alternatives ( IF ..ELSE
ELSE, Case)
- Boucles ( LOOP , WHILE , FOR)

Introduction :
Rappelons nous que le PL/ SQL fait des choses supplémentaires que SQL ne peut pas faire seul. Il est
donc considéré comme une extension de SQL. Il est particulièrement utile pour les calculs, les mises
à jour, les actions complexes, vérification, etc...Bref
etc c’est un langage de programmation
procédurale. Dans ce TP,, vous allez essayer quelques exemples de blocs anonymes, avec les
commandes PL/SQL. Puis programmer avec le PL/SQL en utilisant les branchements conditionnels
(IF..else,, CASE) et les boucles (LOOP, FOR et WHILE
ILE).
Important :
- Dans tout le TP vous utiliser le schéma HR, si vous avez oublié le mot de passe, procéder
comme suit pour l’initialiser :
Invite de commandes cmd :
C:\Users\hp>sqlplus
sqlplus / as sysdba
SQL> alter user hr identified by hr123 account unlock;
- À chaque fois qu’il est demandé de saisir
saisir une valeur par l’utilisateur, vous utilisez le
caractère de substitution « &» comme vue dans le cours.
Tâche 1:: Un premier exemple
1) Taper ce bloc PL/SQL puis exécutez
exécutez-le:
SET SERVEROUTPUT ON
DECLARE
INTERET CONSTANT NUM
NUMBER (4,2) := 1.15;
MONTANT NUMBER (4,2)
(4,2);
BEGIN
MONTANT:= 100 * INT
INTERET;
DBMS_OUTPUT.PUT_LINE ('PROGRAMME TERMINÉ');
END;

- Vous aurez forcement un message d’erreur similaire à celui ci:


ci
Rapport d'erreur -
ORA-06502: PL/SQL : erreur numérique ou erreur sur une valeur: précision de
NUMBER trop élevée
ORA-06512:
06512: à ligne 5
06502. 00000 - "PL/SQL: numeric or value error%s"
*Action: Change the data, how it is manipulated, or how it is declared so
that values d
doo not violate constraints.

2) Pouvez-vous
vous expliquer quel est le problème?
Tâche 2:
1- Créer une nouvelle table appelée TEMP avec les trois champs suivants sans spécifier la clef primaire
PREMIER VARCHAR2 (20)
DEUXIEME VARCHAR2 (20)
TROISIEME VARCHAR2 (100)
2-
a- Écrire un bloc PL / SQL qui permet de récupérer le nom (last_name) et l'emploi (job_id) de la table
EMPLOYEES de schéma HR pour personnel numéro 100 ( employee_id=100) et l’insert dans la table
TEMP comme suit :
dans les champs DEUXIEME insérer le last_name, dans TROISIEME le job_id, Et PREMIER insérer
l’ employee_id concerné ( c à dire 100 dans notre cas
b- Exécuter le bloc deux fois ou plus, juste pour voir que l'insert se fait plusieurs fois.
c- Essayez la commande ROLLBACK maintenant et vérifier à nouveau la table TEM. que ce qu’est arrivé?
Que faire pour éviter ça ? Faites le et refaire les point b et c.

3- Essayez maintenant avec le code partiellement rempli pour s’aider. Je veux savoir qui gère de département
‘Finance’. en utilisant un bloc PL / SQL
a- vous remplissez les sections, ce qui marqué par des points ( ……………………………)

b- Après avoir terminé et exécuter le code faites un select sur la table TEMP.
Tâche 3: Découvrir les erreurs dans ce code puis les corriger en interprétant le message d’erreur
fournit par le détecteur d'erreur Oracle
Le code ci-dessous est conçu pour calculer la différence de salaire entre deux dates. Tapez le exactement
comme il est (encore mieux, le copiez et collez).

- Corriger toute les erreurs qu’il contient pour obtenir un code qui marche.

Declare;
v_diff varchar2(3)
v_startdate date="11-06-01";
v_enddate data:='4-04-06';
begin
select max(salary)-min(salary) into diff;
from employees where hire_date between startdate and
v_enddate;
dbms_output_put_line ('la différence de salaire entre '|v_startdate || and
'||enddate|| ' est '||v_diff);
end

Tâche 4 : Encore des SELECT … INTO


1- Assurez-vous que vous avez exécuté SET SERVEROUTPUT ON
2- Créer un programme PL / SQL qui demandera un nom de famille d’un employée à entrer. Lorsque le
nom est entré, les colonnes suivantes seront sélectionnée et affichées:

first_name , last_name, job_title , department_name , SALARY


Penser à:

- Utiliser les fonctions UPPER ou LOWER pour éviter la confusion majuscule et minuscule
- Utiliser %type pour le type des variables.
- Utiliser les deux tables : EMPLOYEES, JOBS , Departments
- Utilisez le & pour inviter l'utilisateur à entrer le nom de famille (last_name) de l’employé.

NB : Afficher cela selon un message ayant un sens.


(Exemple : CHEN JOHN est un Accountant , il travaille dans le département Finance
et gagne 17000 $ )

Tâche 5: manipulation des Ifs …….else et case.


1- Écrivez un programme qui accepte deux valeurs entrées au clavier pour les deux variables a
et b (utiliser & pour la substitution). Puis les permute de telles sorte qu’il les affiche en ordre
croissant
2- Écrire un bloc PL/SQL qui accepte un score (entre 0 et 100) en entrée (utiliser & pour la substitution) et
les clase selon les règles ci-dessous. :
80 -100: Grade A 60 - 79: Grade B
40 – 59 : Grade C 20 - 39: Grade D
<20 : Grade E <0 ou >100 : Hors Classe
NB : faites le par deux méthodes En utilisant les IF… else , puis En utilisant le case

Tâche 6: Les BOUCLES

1- Exécuter tout d’abord le code ci-dessous contenant (FOR..LOOP ) et examiner la sortie que vous obtenez.
Begin
For counteur in 1..14 Loop
If mod(counteur,3)=0 then
Dbms_output.put_line('la valeur de counteur divisible par 3 est : '||counteur);
End if;
End loop;
End;

NB : La fonction mode mod(a,b) retourne le reste de la division de a/b


2- Modifier le code ci-dessus de sorte que chaque compteur de boucle est imprimé avec un message
approprié.
3-
a- Créer une nouvelle table (appelez la comme vous voulez) avec un seul attribut de type de données
NUMBER (3). Ne lui pas spécifier une clé primaire..
b- Utilisez une boucle while pour y insérer 6 nouveaux numéros multiples de 100 (ie 100, 200, 300,
400, 500 et 600) , puis Exécutez le bloc PL/SQL
c- Vérifiez le contenu de la table crée en a.
d- Re-Exécutez votre bloc à nouveau
e- Re- Exécutez à nouveau votre bloc! Et Vérifiez votre contenu de la table
f- Tapez la commande d’annulation ROLLBACK. Vérifier de nouveau le contenu de la table. Voir ce qui
est arrivé? Que faire pour éviter cela ?
g- Écrivez un programme PL/SQL qui calcule et affiche le pgcd de deux entiers entrés par l’utilisateur.

Vous aimerez peut-être aussi