Vous êtes sur la page 1sur 1

Licence SMI 2007 - 2008

B.OUAHBI

PL/SQL
Exercice 1 :
Parmi les dclarations de variables suivantes, dterminer celles qui sont incorrectes : A - DECLARE v_id NUMBER(4); Correcte B - DECLARE v_x,v_y,v_z VARCHAR2(10); Incorrecte : un seul identifiant par ligne C - DECLARE v_date_naissance DATE NOT NULL; Incorrecte : une valeur NOT NULL doit tre initialise D - DECLARE v_en_stock BOOLEAN := 1; Incorrecte : 1 nest pas une valeur boolenne E - DECLARE emp_record emp_record_type; Incorrecte : EMP_RECORD_TYPE doit tre dclar F - DECLARE TYPE type_table_nom IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER; dept_table_nom type_table_nom; Correcte

END; / PRINT g_mess b) Tester le bloc. Que se passe-t-il si on saisit un numro de dpartement qui nexiste pas?
SQL> start p2q2 Entrer un numro de dpartement : 134 PL/SQL procedure successfully completed. G_MESS 0 ligne(s) supprime(s).

Si on saisit un numro de dpartement qui a des employs?


SQL> start p2q2 Entrer un numro de dpartement : 31 DECLARE * ERROR at line 1: ORA-02292: integrity constraint (BOHEZ.EMPLOYES_DEPT_ID_FK) violated - child record found ORA-06512: at line 4

c) Tester le bloc avec le dpartement Sant (82)


SQL> start p2q2 Entrer un numro de dpartement : 82 PL/SQL procedure successfully completed. G_MESS 1 ligne(s) supprime(s).

d) Vrifier que le dpartement nexiste plus


SQL> SELECT * 2 FROM departements 3 WHERE id = 82; no rows selected

Exercice 2 :
1 - Crer un bloc PL/SQL pour insrer un nouveau dpartement dans la table DEPARTEMENTS a) Utiliser la squence DEPT_ID_SEQ pour gnrer un numro de dpartement. Crer un paramtre pour le nom du dpartement. Laisser le numro de rgion NULL. Fichier p2q1.sql ACCEPT p_dept_nom PROMPT Entrer un nom de dpartement: BEGIN INSERT INTO departements(id, nom, region_id) VALUES (dept_id_seq.NEXTVAL, &p_dept_nom, NULL); COMMIT; END; / b) Excuter le bloc PL/SQL avec la valeur Sant pour le nom du dpartement.
SQL> start p2q1 Entrer un nom de dpartement : Sant PL/SQL procedure successfully completed.

Exercice 3 :
1 - Crer un bloc PL/SQL permettant de mettre jour le pourcentage de commission dun employ en fonction du total de ses ventes Cet exercice ncessite la suppression de la contrainte sur la colonne commission de la table EMPLOYES :
SQL> ALTER TABLE employes 2 DROP CONSTRAINT employes_commission_ck;

c) Afficher le nouveau dpartement cr


SQL> SELECT * FROM departements 2 WHERE nom = 'Sant'; ID NOM REGION_ID 82 Sant

2 - Crer un bloc PL/SQL pour supprimer le dpartement cr prcdemment a) Crer un paramtre pour le numro de dpartement. Faire afficher lcran le nombre de lignes affectes. Fichier p2q2.sql ACCEPT p_dept_id PROMPT 'Entrer un numro de dpartement : ' VARIABLE g_mess VARCHAR2(30) DECLARE v_resultat NUMBER(2); BEGIN DELETE FROM departements WHERE id = &p_dept_id; v_resultat := SQL%ROWCOUNT; :g_mess := TO_CHAR(v_resultat)||' ligne(s) sup prime(s).'; COMMIT;

a) Crer un paramtre qui reoit un numro demploy Trouver la somme totale de toutes les commandes traites par cet employ Mettre jour le pourcentage de commission de lemploy : - si la somme est infrieure 100,000 passer la commission 10 - si la somme est comprise entre 100,000 et 1,000,000 inclus passer la commission 15 - si la somme excde 1,000,000 passer la commission 20 - si aucune commande nexiste pour cet employ, mettre la commission 0 Valider la modification (commit) Fichier p3q1.sql. ACCEPT p_id PROMPT 'Entrer un numro de vendeur : ' DECLARE v_somme_total NUMBER(11,2); v_comm employes.commission%TYPE; BEGIN SELECT SUM(total) INTO v_somme_total FROM commandes WHERE vendeur_id = &p_id; IF v_somme_total < 100000 THEN v_comm := 10; ELSIF v_somme_total <= 1000000 THEN v_comm := 15; ELSIF v_somme_total > 1000000 THEN v_comm := 20; ELSE v_comm := 0;