Vous êtes sur la page 1sur 14

Aperu de lexercice Cet exercice consolidera les bases PL/SQL apprises durant de cette leon.

Ceci inclut les types, les dfinitions valides, les identifiants et la validation dexpressions. Vous rassemblerez tous ces lments pour crer un bloc PL/SQL simple. Questions sur Papier Les questions 1 et 2 sont traiter sur papier. Exercice 1 1. Evaluez chacune des dclarations suivantes. Dterminez lesquelles sont invalides et expliquez pourquoi. a. DECLARE v_id NUMBER(4); b. DECLARE v_x, v_y, v_z c. DECLARE v_hiredate DECLARE v_in_stock VARCHAR2(10);

DATE NOT NULL;

d.

BOOLEAN := 1;

Exercice 1 (suite) 2. Dans chacunes des affectations suivantes, dterminez le type de lexpression rsultante. a. b. c. v_sum := $100,000 + $250,000; d. v_flag := TRUE; e. v_n1 := v_n2 > (2 * v_n3); f. v_valeur := NULL; v_days_to_go := v_due_date - SYSDATE; v_sender := USER || ': ' || TO_CHAR(v_dept_no);

3. Crez un bloc anonyme qui affiche lcran la phrase Mon bloc PL/SQL fonctionne. . G_MESSAGE ----------------------Mon bloc PL/SQL fonctionne Exercice 1 (suite) Si vous en avez le temps, effectuez lexercice suivant : 4. Crez un bloc qui dclare deux variables. Affectez la valeur de ces variables PL/SQL des variables htes SQL*Plus et affichez les rsultats des variables PL/SQL lcran. Excutez votre bloc PL/SQL. Enregistrez votre bloc PL/SQL dans un fichier nomm plq4.sql. V_CHAR Character (variable length) V_NUM Number Affecter ces variables les valeurs suivantes : Variable Valeur -------- ------------------------------------V_CHAR La constante : 42 est la rponse V_NUM Les deux premiers caractres de V_CHAR G_CHAR --------------------42 est la rponse G_NUM ---------42 Aperu de lexercice Cet exercice insiste sur les bases du PL/SQL prsentes dans ce chaptitre, y compris les rgles dimbrication des blocs PL/SQL ainsi que la faon dexcuter et de tester le code PL/SQL. Questions lcrit Les questions 1 et 2 sont traiter sur papier. Exercice 2 DECLARE v_weight NUMBER(3) := 600; v_message VARCHAR2(255) := 'Product 10012'; BEGIN /* SOUS-BLOC */ DECLARE v_weight NUMBER(3) := 1; v_message VARCHAR2(255) := 'Product 11001'; v_new_locn VARCHAR2(50) := 'Europe'; BEGIN v_weight := v_weight + 1; v_new_locn := 'Western ' || v_new_locn; END;

v_weight := v_weight + 1; v_message := v_message || ' is in stock'; v_new_locn := 'Western ' || v_new_locn; END; 1. Considrez le bloc PL/SQL ci-dessus et dterminez le type de donnes et la valeur de chacune des variables suivantes daprs les rgles de visibilit. a. La valeur de V_WEIGHT dans le sous-bloc est : _____________________________________________________________________ b. La valeur de V_NEW_LOCN dans le sous-bloc est : _____________________________________________________________________ c. La valeur de V_WEIGHT dans le bloc principal est : _____________________________________________________________________ d. La valeur de V_MESSAGE dans le bloc principal est : _____________________________________________________________________ e. La valeur de V_NEW_LOCN dans le bloc principal est : _____________________________________________________________________ Exercice 2 (suite) Exemple sur la porte des donnes DECLARE v_customer VARCHAR2(50) := 'Womansport'; v_credit_rating VARCHAR2(50) := 'EXCELLENT'; BEGIN DECLARE v_customer NUMBER(7) := 201; v_name VARCHAR2(25) := 'Unisports'; BEGIN v_customer v_name v_credit_rating END; v_customer END; 2. Supposons que vous imbriquiez un sous-bloc dans un bloc, comme ci-dessus. Vous dclarez deux variables, V_CUSTOMER et V_CREDIT_RATING, dans le bloc principal. Vous dclarez aussi deux variables, V_CUSTOMER et V_NAME, dans le sousbloc. Dterminez les valeurs et le type de de donnes pour chacun des cas suivants. a. La valeur de V_CUSTOMER dans le sous-bloc est : v_name v_credit_rating

_____________________________________________________________________ b. La valeur de V_NAME dans le sous-bloc est : _____________________________________________________________________ c. La valeur de V_CREDIT_RATING dans le sous-bloc est : _____________________________________________________________________ d. La valeur de V_CUSTOMER dans le bloc principal est : _____________________________________________________________________ e. La valeur de V_NAME dans le bloc principal est : _____________________________________________________________________ f. La valeur de V_CREDIT_RATING dans le bloc principal est : _____________________________________________________________________ Exercice 2 (suite) 3. Crez et excutez un bloc PL/SQL qui prenne en compte deux nombres grce des variables de substitution SQL*Plus. Il faut diviser le premier nombre par le second, et ajouter le rsultat au second nombre. Le rsultat doit tre stock dans une variable PL/SQL et affich lcran. Veuillez saisir le premier nombre : 2 Veuillez saisir le second nombre : 4 PL/SQL procedure successfully completed. G_RESULT ---------4.5 4. Codez un bloc PL/SQL qui calcule le gain total pour une anne. Le salaire annuel et le pourcentage de bonus de lanne sont transmis au bloc PL/SQL laide de variables de substitution SQL*Plus, et le bonus doit tre converti dun nombre entier en dcimal (par exemple, 15 en 0,15). Si le salaire est NULL, dfinissez-le zro avant de calculer le traitement total. Excutez le bloc PL/SQL. Rappel : Utilisez la fonction NVL pour manipuler les valeurs NULL. Remarque : Pour tester la fonction NVL, tapez NULL au prompt ; puis [Return] cela provoque une erreur . Veuillez saisir le salaire annuel : 50000 Veuillez saisir le % de bonus : 10 PL/SQL procedure successfully completed. G_TOTAL ------55000

Prsentation de lExercice Crer un bloc PL/SQL pour slectionner des donnes dune table Crer un bloc PL/SQL pour insrer des donnes dans une table Crer un bloc PL/SQL pour mettre jour des donnes dune table Crer un bloc PL/SQL pour supprimer un enregistrement dune table Aperu de lexercice Dans cet exercice, vous allez crer des procdures pour slectionner, saisir, mettre jour, et supprimer les informations dune table, en utilisant les requtes SQL de base et les instructions LMD dans un bloc PL/SQL. Exercice 3 1. Crez un bloc PL/SQL qui slectionne le plus grand numro de dpartement (DEPTNO) de la table DEPT et le stocke dans une variable SQL*Plus. Affichez le rsultat lcran. Enregistrez votre bloc PL/SQL dans le fichier p3q1.sql. G_MAX_DEPTNO ----------40 2. Modifiez le bloc PL/SQL que vous avez cr la question 1 pour insrer un nouveau dpartement dans la table DEPT. Enregistrez votre bloc PL/SQL dans le fichier p3q2.sql. a. Plutt que dafficher le numro de dpartement extrait dans la question 1, ajoutez 10 ce numro et utilisez ce nouveau numro pour crer le nouveau dpartement. b. Utilisez un paramtre de substitution SQL*Plus pour le nom du dpartement. c. Laissez la localit(LOC) la valeur NULL pour linstant. d. Excutez le bloc PL/SQL. Veuillez saisir le nom du dpartement: EDUCATION PL/SQL procedure successfully completed. e. Affichez le nouveau dpartement que vous avez cr. DEPTNO DNAME LOC ----- --------- ----50 EDUCATION 3. Crez un bloc PL/SQL qui mette jour la localit (LOC) dun dpartement existant. Enregistrez votre bloc PL/SQL dans le fichier p3q3.sql. a. Utilisez un paramtre de substitution SQL*Plus pour le numro du dpartement (DEPTNO). b. Utilisez un paramtre de substitution SQL*Plus pour la localit du dpartement (LOC). c. Testez le bloc PL/SQL . Veuillez saisir le numro dpartement: 50 Veuillez saisir la localit du dpartement: LYON PL/SQL procedure successfully completed. Exercice 3 (suite) d. Affichez le numro, le nom et la localit du dpartement mis jour. DEPTNO DNAME LOC

----- --------- --------------50 EDUCATION LYON e. Affichez le dpartement que vous avez mis jour. 4. Crez un bloc PL/SQL qui supprime le dpartement cr la question 2. Enregistrez votre bloc PL/SQL dans le fichier p3q4.sql. a. Utilisez un paramtre de substitution SQL*Plus pour le numro de dpartement. b. Affichez lcran le nombre denregistrements affects. c. Testez le bloc PL/SQL. Veuillez saisir le numro du dpartement : 50 PL/SQL procedure successfully completed. G_RESULT ----------------------------------------------------------1 enregistrement(s) supprim(s). d. Que se passe-t-il si vous entrez un numro de dpartement inexistant ? Veuillez saisir le numro du dpartement : 99 PL/SQL procedure successfully completed. G_RESULT ----------------------------------------------------------0 enregistrement(s) supprim(s). e. Vrifiez que le dpartement a bien t supprim. no rows selected Aperu de lexercice Dans cet exercice, vous crivez des bloc PL/SQL comportant des boucles et des structures conditionnelles. Exercice 4 1. Excutez le script lab4_1.sql pour crer une table MESSAGES. Ecrivez un Bloc PL/SQL pour insrer des nombres dans la table MESSAGES. a. Insrez les nombres de 1 10, en excluant 6 et 8. b. Programmer un commit avant la fin du bloc PL/SQL c. Afficher le contenu de la table MESSAGES pour tester votre bloc PL/SQL

RESULTS --------1 2 3 4 5 7 9 10 2. Crez un bloc PL/SQL qui calcul le montant de la commission dun employ donn, en fonction de son salaire.

a. b. substitution c. salaire. d. vaut 15% du e. salaire. f. g. h. chaque cas,

Excutez le script lab4_2.sql qui cre un nouvel employ dans la table EMP. Note : Lemploy aura un salaire NULL. Faites saisir le numro demploy lutilisateur, laide dune variable de SQL*Plus. Si le salaire de lemploy est infrieur $1000, la commission vaut 10% du Si le salaire de lemploy est compris entre $1000 et $1500, la commission salaire. Si le salaire de lemploy est suprieur $1500, la commission vaut 20% du Si le salaire de lemploy est NULL, la commission vaut 0. Programmer un commit avant la fin du bloc PL/SQL Excuter votre programme PL/SQL, utiliser le tableau suivant pour tester

et vrifier la valeur de la commission. Exercice 4 (suite) EMPNO ENAME SAL COMM ----- ------ ----- --------8000 DOE 0 7499 ALLEN 1600 320 7934 MILLER 1300 195 7369 SMITH 800 80 Sil vous reste du temps, faites les exercices suivants : 3. Modifiez le fichier p1q4.sql pour insrez le texte Nombre pair ou Nombre impair , selon que le nombre correspondant dans la table MESSAGES est pair ou impair. Regardez votre table MESSAGES pour vrifier que le programme PL/SQL a fonctionn. RESULTS --------------Nombre pair 4. Ajoutez une nouvelle colonne STARS varchar2(100), dans la table EMP qui permettra de stocker des toiles (*). 5. Crez un programme PL/SQL qui rcompense les employs en leur attribuant une toile dans la colonne STARS par tranche de salaire de $100.Sauvegardez votre programme PL/SQL sous le nom p4q5.sql. a. Faites saisir le numro demploy lutilisateur, par une variable de substitution SQL*Plus. b. Initialiser une variable qui contiendra un ensemble dtoile (*). c. Ajoutez une toile la chane par tranche de salaire de $100. Par exemple , si lemploy a un salaire de $800, la chane comportera 8 toiles. Si lemploy touche un salaire de $1250, la chane comportera 13 toiles. d. Programmer un Update de la colonne STARS de tous les employs avec cette chane (*). e. Programmer un commit avant la fin du bloc PL/SQL f. Testez le programme pour les employs qui nont pas de salaires et pour ceux qui en ont un.

Exercice 4 (Suite) Entrez le numro demploy : 7934 PL/SQL procedure successfully completed. Entrez le numro demploy : 8000 PL/SQL procedure successfully completed. EMPNO SAL STARS ----- ------ ---------------8000 7934 1300 ************* Prsentation de lExercice Dclaration de Tables PL/SQL Traitement de donnes utilisant des tables PL/SQL Dclaration de Records PL/SQL Traitement de donnes utilisant des Records PL/SQL Aperu de lexercice Dans cet exercice, vous crivez des bloc PL/SQL comportant des boucles et des structures conditionnelles. Exercice 4 1. Excutez le script lab4_1.sql pour crer une table MESSAGES. Ecrivez un Bloc PL/SQL pour insrer des nombres dans la table MESSAGES. a. Insrez les nombres de 1 10, en excluant 6 et 8. b. Programmer un commit avant la fin du bloc PL/SQL c. Afficher le contenu de la table MESSAGES pour tester votre bloc PL/SQL

RESULTS --------1 2 3 4 5 7 9 10 2. Crez un bloc PL/SQL qui calcul le montant de la commission dun employ donn, en fonction de son salaire. a. Excutez le script lab4_2.sql qui cre un nouvel employ dans la table EMP. Note : Lemploy aura un salaire NULL. b. Faites saisir le numro demploy lutilisateur, laide dune variable de substitution SQL*Plus. c. Si le salaire de lemploy est infrieur $1000, la commission vaut 10% du salaire.

d. vaut 15% du e. salaire. f. g. h. chaque cas,

Si le salaire de lemploy est compris entre $1000 et $1500, la commission salaire. Si le salaire de lemploy est suprieur $1500, la commission vaut 20% du Si le salaire de lemploy est NULL, la commission vaut 0. Programmer un commit avant la fin du bloc PL/SQL Excuter votre programme PL/SQL, utiliser le tableau suivant pour tester

et vrifier la valeur de la commission. Exercice 4 (suite) EMPNO ENAME SAL COMM ----- ------ ----- --------8000 DOE 0 7499 ALLEN 1600 320 7934 MILLER 1300 195 7369 SMITH 800 80 Sil vous reste du temps, faites les exercices suivants : 3. Modifiez le fichier p1q4.sql pour insrez le texte Nombre pair ou Nombre impair , selon que le nombre correspondant dans la table MESSAGES est pair ou impair. Regardez votre table MESSAGES pour vrifier que le programme PL/SQL a fonctionn. RESULTS --------------Nombre pair 4. Ajoutez une nouvelle colonne STARS varchar2(100), dans la table EMP qui permettra de stocker des toiles (*). 5. Crez un programme PL/SQL qui rcompense les employs en leur attribuant une toile dans la colonne STARS par tranche de salaire de $100.Sauvegardez votre programme PL/SQL sous le nom p4q5.sql. a. Faites saisir le numro demploy lutilisateur, par une variable de substitution SQL*Plus. b. Initialiser une variable qui contiendra un ensemble dtoile (*). c. Ajoutez une toile la chane par tranche de salaire de $100. Par exemple , si lemploy a un salaire de $800, la chane comportera 8 toiles. Si lemploy touche un salaire de $1250, la chane comportera 13 toiles. d. Programmer un Update de la colonne STARS de tous les employs avec cette chane (*). e. Programmer un commit avant la fin du bloc PL/SQL f. Testez le programme pour les employs qui nont pas de salaires et pour ceux qui en ont un.

Exercice 4 (Suite) Entrez le numro demploy : 7934 PL/SQL procedure successfully completed. Entrez le numro demploy : 8000 PL/SQL procedure successfully completed.

EMPNO SAL STARS ----- ------ ---------------8000 7934 1300 ************* Prsentation de lExercice Dclaration de Tables PL/SQL Traitement de donnes utilisant des tables PL/SQL Dclaration de Records PL/SQL Traitement de donnes utilisant des Records PL/SQL Aperu de lexercice Dans cet exercice, vous allez dfinir, crer, et utiliser des TABLES PL/SQL et des RECORDS PL/SQL. Exercice 5 1. Crez un bloc PL/SQL pour retrouver le nom de chaque dpartement partir de la table DEPT et affichez le nom de chaque dpartement lcran, en utilisant une table PL/SQL. a. Dclarez une table PL/SQL, MY_DEPT_TABLE, pour stocker temporairement le nom de ces dpartements. b. En utilisant une boucle, retrouvez le nom de tous les dpartements de la table DEPT et stockez-les dans la TABLE PL/SQL. Chaque dpartement a un numro multiple de 10. c. En utilisant une autre boucle, retrouvez les noms des dpartements dans la TABLE PL/SQL et affichez-les lcran en utilisant DBMS_OUTPUT.PUT_LINE.

SQL> start p5_1 ACCOUNTING RESEARCH SALES OPERATIONS PL/SQL procedure successfully completed. 2. Ecrivez un bloc PL/SQL permettant dafficher des informations dune commande donne. a. Dclarez un record PL/SQL bas sur la structure de la table ORD. b. Utilisez une variable de substitution SQL*Plus pour retrouver les informations relatives une commande spcifique et stockez cette information dans le record PL/SQL. c. Utilisez DBMS_OUTPUT. PUT_LINE pour afficher les informations de cette commande. SQL> start p5_2 Entrer un numro de commande : 614 La commande 614 a t saisie le 01-FEB-87 et livre le 05-FEB-87 pour un total de $23,940.00

PL/SQL procedure successfully completed. Exercice 5 (suite) Sil vous reste du temps. 3. Modifiez le bloc PL/SQL que vous avez cr dans lexercice 1, pour retrouvez toutes les informations relatives chaque dpartement de DEPT et affichez ces informations lcran en utilisant une Table de Records PL/SQL. a. Dclarez une table PL/SQL, MY_DEPT_TABLE, pour stocker temporairement les numro, nom, et location de chaque dpartement. b. En utilisant une boucle, retrouvez les informations pour chaque dpartement situ dans la table DEPT, et stockez-les dans la table PL/SQL. Chaque dpartement a un numro multiple de 10. c. En utilisant une autre boucle, retrouvez les informations relatives aux dpartements, stockez-les dans la table PL/SQL et affichez-les lcran en utilisant DBMS_OUTPUT.PUT_LINE.

SQL> start p5_3 Dept. 10, ACCOUNTING est situ NEW YORK Dept. 20, RESEARCH est situ DALLAS Dept. 30, SALES est situ CHICAGO Dept. 40, OPERATIONS est situ BOSTON PL/SQL procedure successfully completed. Dclarer et utiliser des curseurs explicites pour ramener les lignes dune table. Utiliser un curseur dans une boucle FOR Utiliser les attributs de curseur pour tester le statut du curseur. Aperu de lexercice Cet exercice met en pratique votre connaissance des curseurs pour traiter des lignes partir dune table et remplir une autre table avec les rsultats en utilisant un curseur dans une boucle FOR.

Exercice 6 1. Lancer le script lab6_1.sql pour crer la table TOP_DOGS qui va permettre de stocker les employs et leur salaires. SQL> CREATE TABLE top_dogs 2 (name VARCHAR2(25), 3 salary NUMBER(11,2)); 2. Crer un bloc PL/SQL qui dtermine les employs ayant les salaires les plus levs. a. Faire saisir lutilisateur une valeur n dans un paramtre de substitution SQL*PLUS. b. Dans une boucle, rcuprez les noms et salaires des personnes les mieux rmunres dans la table EMP.

c. Enregistrez les noms et salaires dans la table TOP_DOGS. d. Assurez-vous que deux employs naient pas le mme salaire. e. Testez les cas particuliers tels que n = 0 et n >au nombre total demploys dans EMP. Afficher le contenu de la table TOP_DOGS lcran aprs chaque test et prvoir de videz ensuite cette table. Entrez le nombre des employs les mieux rmunrs : 5 NAME SALARY ----------- -----KING 5000 FORD 3000 SCOTT 3000 JONES 2975 BLAKE 2850 3. Considrez le cas o plusieurs employs ont le mme salaire. Si une personne est liste, alors toutes les personnes ayant le mme salaire devraient ltre aussi. a. Par exemple, si lutilisateur saisi la valeur 2 : alors King, Ford, et Scott devraient tre affichs. (Ces employs ont le second plus haut salaire). b. Si lutilisateur saisi la valeur 3 : alors King, Ford, Scott, et Jones devraient tre affichs. c. Videz toutes les lignes de TOP_DOGS et entranez-vous. Entrez le nombre des employs les mieux rmunrs : 2 NOM SALAIRE ------------ -----KING 5000 FORD 3000 SCOTT 3000 Exercice 6 (suite) Entrez le nombre des employs les mieux rmunrs : 3 NAME SALARY ------------ -----KING 5000 FORD 3000 SCOTT 3000 JONES 2975 Dclaration et utilisation de curseurs explicites paramtrs Utilisation d un curseur FOR UPDATE Aperu de lexercice Ces exercices mettent en pratique votre connaissances des curseurs paramtrs pour traiter un certain nombres denregistrements depuis diffrentes tables. Exercice 7 1. Ecrivez une requte pour obtenir tous les dpartements ainsi que leurs employs. Insrez le rsultat dans la table MESSAGES. Utilisez un curseur pour obtenir le numro de dpartement et passez ce numro un curseur pour obtenir les employs de ce dpartement. RESULTS -----------------------KING - Department 10

CLARK - Department 10 MILLER - Department 10 JONES - Department 20 FORD - Department 20 SMITH - Department 20 SCOTT - Department 20 ADAMS - Department 20 BLAKE - Department 30 MARTIN - Department 30 ALLEN - Department 30 TURNER - Department 30 JAMES - Department 30 WARD - Department 30 14 rows selected. 2. Modifiez p4q5.sql pour incorporer les fonctionnalits de FOR UPDATE et de WHERE CURRENT OF dans le traitement du curseur. EMPNO SAL STARS ----- ------ --------------------8000 7900 950 ********** 7844 1500 *************** Traiter des exceptions nommes Crer et faire rfrence des exceptions dfinies par lutilisateur Aperu de lexercice Dans cet exercice, vous devez crer des fonctions de traitement dexceptions pour des situations particulires. Exercice 8 1. Ecrire un bloc PL/SQL permettant de slectionner le nom dun employ en connaissant le montant de son salaire. a. Si le salaire entr, renvoie plus dune ligne, traiter lexception avec une fonction approprie et insrer dans la table MESSAGES le message suivant : Plus dun employ avec le salaire : <salaire>. b. Si le salaire entr ne renvoie aucune ligne, traiter lexception avec une fonction approprie et insrer dans la table MESSAGES le message suivant : Pas demploy avec ce salaire : <salaire>. c. Si le salaire entr ne renvoie quune ligne, insrer dans la table MESSAGES le nom de lemploy et le montant de son salaire. d. Traiter toute autre exception avec une fonction approprie et insrer dans la table MESSAGES le message Autre erreur. e. Tester le programme. RESULTS -------------------------------------------SMITH - 800 Plus dun employ avec le salaire : 3000 Pas demploy avec le salaire : 6000 2. Modifier p3q3.sql pour ajouter une fonction de traitement des exceptions. a. Ecrire une fonction de traitement des exceptions pour transmettre un message lutilisateur indiquant que le dpartement nexiste pas.

b. Excuter le programme PL/SQL en entrant un dpartement qui nexiste pas. Entrer le numro de dpartement : 50 Entrer la localit du dpartement :HOUSTON PL/SQL procedure successfully completed. G_MESSAGE -------------------------------------Le dpartment 50 nexiste pas 3. Ecrire un programme PL/SQL qui affiche le nombre demploys qui gagnent 100 $ de plus ou de moins que le montant du salaire donn. a. Sil ny a pas demploys dans cette tranche de salaires, afficher un message lutilisateur en utilisant une exception. b. Sil y a au moins un employ dans cette tranche de salaires, le message doit indiquer combien demploys sont dans cette tranche. c. Traiter toute autre exception avec une fonction approprie. Le message doit indiquer quune autre erreur est survenue. Exercice 8 (suite) Entrer le salaire : 800 PL/SQL procedure successfully completed. G_MESSAGE ---------------------------------------------------------Il y a 1 employ(s) avec un salaire entre 700 et 900 Entrer le salaire : 3000 PL/SQL procedure successfully completed. G_MESSAGE ---------------------------------------------------------Il y a 3 employ(s) avec un salaire entre 2900 et 3100 Entrer le salaire : 6000 PL/SQL procedure successfully completed. G_MESSAGE ---------------------------------------------------------Il ny a pas demploy avec un salaire entre 5900 et 6100