Advertisement
clevernessisamyth

Examen 2019 PL/SQL

Aug 20th, 2020 (edited)
455
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 4.21 KB | None | 0 0
  1. -- ex1
  2. SET SERVEROUTPUT ON
  3. ACCEPT code_Formation PROMPT 'Saisir le code la formation.';
  4. ACCEPT code_Etudiant PROMPT 'Saisir le code de l''etudiant.';
  5. DECLARE
  6.   TYPE record_UV IS RECORD (CODUV1 INSCRIPTIONS.CODUV1, NOMUV1 INSCRIPTIONS.NOMUV1,
  7.                             CODUV2 INSCRIPTIONS.CODUV1, NOMUV2 INSCRIPTIONS.NOMUV1,
  8.                             CODUV3 INSCRIPTIONS.CODUV1, NOMUV3 INSCRIPTIONS.NOMUV1
  9.                             );
  10.   UV  record_UV;
  11.  
  12.   v_check INSCRIPTIONS%ROWTYPE; -- 3la wed dak test fl question 2
  13. BEGIN
  14. -- 1 -- fetching CODUi & NOMUVi for a given formation code.
  15.   SELECT
  16.   CODUV1, NOMUV1
  17.   , CODUV2, NOMUV2
  18.   , CODUV3, NOMUV3
  19.   INTO UV
  20.   FROM INSCRIPTIONS
  21.   WHERE CODEFORM = &code_Formation
  22.   GROUP BY CODEFORM;
  23.  
  24. -- 2 -- Si l'etudiant est deja inscrit à une filiere autre que ce que l'utilisateur a saisit, on la modifie.
  25.   SELECT *
  26.   INTO v_check
  27.   FROM INSCRIPTIONS
  28.   WHERE NUMETUD = &cod_Etudiant
  29.   AND CODFORM != &cod_Formation;
  30.  
  31.   IF SQL%FOUND THEN -- ila l9a chi etudiant kayn
  32.     UPDATE INSCRIPTIONS
  33.     SET CODFORM = &cod_Formation
  34.       , LIBELLE = ( SELECT LIBELLE
  35.                     FROM INSCRIPTIONS
  36.                     WHERE CODFORM = &cod_Formation )
  37.       , CODUV1 = UV.CODUV1, NOMUV1 = UV.NOMUV1
  38.       , CODUV2 = UV.CODUV2, NOMUV2 = UV.NOMUV2
  39.       , CODUV3 = UV.CODUV3, NOMUV3 = UV.NOMUV3
  40.       , NOTE1 = NULL, NOTE2 = NULL, NOTE3 = NULL
  41.       , MOYENNE = NULL, MENTION = NULL
  42.     WHERE NUMETUD = &cod_Etudiant;
  43.   ELSE
  44.       raise_application_error(-20003, "Etudiant introuvable ou déjà inscrit à cette filière.");
  45.   END IF;
  46.  
  47. -- 3 -- Le calcul de la moyenne et de la mention de l'etudiant.
  48.   -- had l blan dyl CASE rah 3adi, bhal switch case dyl C
  49.   -- o had le3Ba dyl SET (MOYENNE, MENTION) bhal l blan dyl SELECT INTO o kat3tih 2 variable
  50.   -- ye3Ni hna hssbt l moyenne b dik requete o f nefss l we9t l mention o returnithom bjuj
  51.   UPDATE INSCRIPTIONS
  52.   SET (MOYENNE, MENTION)=( SELECT (NOTE1+NOTE2+NOTE3)/3 AS MOYENNE,
  53.                               CASE
  54.                                   WHEN MOYENNE < 10 THEN 'AJ'
  55.                                   WHEN MOYENNE >= 10 AND MOYENNE < 12 THEN 'PA'
  56.                                   WHEN MOYENNE >= 12 AND MOYENNE < 14 THEN 'AB'
  57.                                   WHEN MOYENNE >= 14 AND MOYENNE < 16 THEN 'B'
  58.                                   WHEN MOYENNE >= 16 AND MOYENNE < 18 THEN 'TB'
  59.                                   ELSE 'E'
  60.                               END AS MENTION
  61.                             FROM INSCRIPTIONS
  62.                             WHERE NUMETUD = &cod_Etudiant
  63.                             AND CODEFORM = &cod_Formation )
  64.   WHERE NUMETUD = &cod_Etudiant
  65.   AND CODEFORM = &cod_Formation;
  66.    
  67. EXCEPTION
  68.   WHEN NO_DATA_FOUND THEN
  69.     DBMS_OUTPUT.PUT_LINE('Formation inconnue');
  70.  
  71. END;
  72. /
  73.  
  74. -- ex2
  75. -- 1 --
  76. CREATE OR REPLACE TRIGGER pret_mens
  77. BEFORE INSERT
  78. ON PRET_SANS_INTERET
  79. FOR EACH ROW
  80. DECLARE
  81.   v_PRETNO NUMBER;
  82.   v_SALN NUMBER;
  83. BEGIN
  84.   SELECT PRETNO -- si ce requete retourne plusieurs lignes, ça veut dire que l'employé a déjà fait 2 prêts, une exception va se lancer.
  85.   INTO v_PRETNO
  86.   FROM PRET_SANS_INTERET
  87.   WHERE EMPNO = :NEW.EMPNO;
  88.  
  89.   SELECT SALN -- hna kenjbdo salaire dyalo bch n7ssbo bih dak l pourcentage
  90.   INTO v_SALN
  91.   FROM EMP
  92.   WHERE EMPNO = v_EMPNO;
  93.      
  94.   IF (:NEW.MONTANT / :NEW.DUREE) > 0.3*(SALN) THEN -- si la mensualité du prêt dépasse 30% celle du client, une exception va se lancer
  95.     raise_application_error(-20005,'La mensualité du prêt dépasse 30% celle du client');
  96.   END IF;
  97.  
  98. EXCEPTION
  99.   WHEN TOO_MANY_ROWS THEN
  100.     DBMS_OUTPUT.put_line('Peut pas ajouter plus que 2 prêts par employé.');
  101.  
  102. END;
  103. /
  104.  
  105. -- 2 --
  106. -- souscription ze3Ma l ajout dyl new ligne f table dyl pret
  107. CREATE OR REPLACE TRIGGER saln
  108. AFTER INSERT
  109. ON PRET_SANS_INTERET
  110. FOR EACH ROW
  111. BEGIN
  112.   -- kif gelna mli khuna khda l pret,
  113.   -- kikhess salaire net dyalo f kol mois ytn9ss bch ykhelss lina l pret
  114.   -- dik DUREE dyl pret o l montant huwa chhal khda fl PRET
  115.   -- ila khda 2000Dh o galihom bli ghanrej3O likom f derf 3am
  116.   -- kol chhar ghadi ne9sso lih 2000 / 12 = hh
  117.   UPDATE EMP
  118.   SET SALN = SALB - :NEW.MONTANT / :NEW.DUREE
  119.   WHERE EMPNO = :NEW.EMPNO;
  120. END;
  121. /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement