Advertisement
cesarcardinale

M3106C BDA - TP3

Sep 24th, 2018
258
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 3.62 KB | None | 0 0
  1. /* Première étape */
  2.     /* Question 1 */
  3.     CREATE OR REPLACE TRIGGER SUPMATENS
  4.     BEFORE DELETE ON MODULE
  5.     FOR EACH ROW
  6.     DECLARE
  7.         CODEENS ENSEIGNT.CODE % TYPE;
  8.     BEGIN
  9.         SELECT DISTINCT CODE INTO CODEENS FROM ENSEIGNT WHERE ENSEIGNT.CODE = :OLD.CODE;
  10.         IF :OLD.CODE = CODEENS
  11.         THEN
  12.             RAISE_APPLICATION_ERROR( -20001, 'Supression impossible, module enseigné.' );
  13.         END IF;
  14.     END;
  15.    
  16.     /* Question 2 */
  17.     CREATE OR REPLACE TRIGGER INSMATENS
  18.     BEFORE INSERT ON ENSEIGNT
  19.     FOR EACH ROW
  20.     DECLARE
  21.         CODEENS ENSEIGNT.CODE % TYPE;
  22.     BEGIN
  23.         SELECT DISTINCT CODE INTO CODEENS FROM MODULE WHERE MODULE.CODE = :NEW.CODE;
  24.         IF :NEW.CODE != CODEENS
  25.         THEN
  26.             RAISE_APPLICATION_ERROR( -20001, 'Insertion impossible, module non enseigné.' );
  27.         END IF;
  28.     END;
  29.  
  30. /* Deuxième étape */
  31.     /* Question 3 */
  32.     CREATE OR REPLACE TRIGGER MOYNULL
  33.     BEFORE INSERT OR UPDATE OF MOY_CC, MOY_TEST ON NOTATION
  34.     FOR EACH ROW
  35.     BEGIN
  36.         IF :NEW.MOY_TEST IS NULL THEN :NEW.MOY_TEST := 0; END IF;
  37.         IF :NEW.MOY_CC IS NULL THEN :NEW.MOY_CC := 0; END IF;
  38.     END;
  39.  
  40. /* Troisième étape */
  41.     /* Question 4 */
  42.     CREATE OR REPLACE TRIGGER ETUNOTA
  43.     BEFORE INSERT OR UPDATE ON NOTATION
  44.     FOR EACH ROW
  45.     DECLARE
  46.         MATSUIVI NOTATION.CODE % TYPE;
  47.     BEGIN
  48.         SELECT DISTINCT CODE INTO MATSUIVI FROM ENSEIGNT WHERE ENSEIGNT.NUM_ET = :NEW.NUM_ET;
  49.         IF :NEW.CODE != MATSUIVI THEN RAISE_APPLICATION_ERROR( -20001, 'Cet étudiant ne suit pas ce module.' ); END IF;
  50.     END;
  51.    
  52.     /* Question 5 */
  53.     CREATE OR REPLACE TRIGGER COEFCONTR
  54.     BEFORE INSERT OR UPDATE ON MODULE
  55.     FOR EACH ROW
  56.     BEGIN
  57.         IF (:NEW.COEFF_TEST + :NEW.COEFF_CC) != 100 THEN RAISE_APPLICATION_ERROR( -20001, 'Les coefficients ne sont pas égaux à 100.' ); END IF;
  58.     END;
  59.  
  60. /* Quatrième étape */
  61.     /* Question 6 */
  62.     CREATE TABLE GROUPE(ANNEE NUMBER(2,0), NUMERO NUMBER(2,0), EFFECTIF NUMBER(3,0), CONSTRAINT pk_ANNEEGR PRIMARY KEY (ANNEE,NUMERO));
  63.    
  64.     DECLARE
  65.         NB_GROUPE1 NUMBER(1,0);
  66.         NB_GROUPE2 NUMBER(1,0);
  67.         EFFECTIF GROUPE.EFFECTIF%TYPE;
  68.         AUCUN_ETUDIANT EXCEPTION;
  69.     BEGIN
  70.         COMMIT;
  71.         SELECT COUNT(DISTINCT GROUPE) INTO NB_GROUPE1 FROM ETUDIANT WHERE ANNEE = 1;
  72.         SELECT COUNT(DISTINCT GROUPE) INTO NB_GROUPE2 FROM ETUDIANT WHERE ANNEE = 2;
  73.         IF NB_GROUPE1 = 0 OR NB_GROUPE2 = 0 THEN RAISE AUCUN_ETUDIANT; END IF;
  74.         FOR i IN 1 .. NB_GROUPE1
  75.         LOOP
  76.             SELECT COUNT(*) INTO EFFECTIF FROM ETUDIANT WHERE GROUPE = i AND ANNEE = 1;
  77.             INSERT INTO GROUPE (ANNEE, NUMERO, EFFECTIF) VALUES (1, i, EFFECTIF);
  78.         END LOOP;
  79.         FOR i IN 1 .. NB_GROUPE2
  80.         LOOP
  81.             SELECT COUNT(*) INTO EFFECTIF FROM ETUDIANT WHERE GROUPE = i AND ANNEE = 2;
  82.             INSERT INTO GROUPE (ANNEE, NUMERO, EFFECTIF) VALUES (2, i, EFFECTIF);
  83.         END LOOP;
  84.         COMMIT;
  85.     EXCEPTION
  86.         WHEN AUCUN_ETUDIANT THEN DBMS_OUTPUT.PUT_LINE('Il n''y a pas d''étudiant');
  87.     END;
  88.    
  89.     /* Question 7 */
  90.     CREATE OR REPLACE TRIGGER AUTOEFFECT
  91.     AFTER INSERT OR UPDATE ON ETUDIANT
  92.     FOR EACH ROW
  93.     BEGIN
  94.         INSERT INTO GROUPE (ANNEE, NUMERO, EFFECTIF) VALUES (:NEW.ANNEE, :NEW.GROUPE, 1);
  95.     EXCEPTION
  96.         WHEN DUP_VAL_ON_INDEX THEN
  97.         UPDATE GROUPE SET EFFECTIF = EFFECTIF + 1 WHERE ANNEE = :NEW.ANNEE AND NUMERO = :NEW.GROUPE;
  98.         IF UPDATING THEN
  99.         UPDATE GROUPE SET EFFECTIF = EFFECTIF - 1 WHERE ANNEE = :OLD.ANNEE AND NUMERO = :OLD.GROUPE;
  100.         END IF;
  101.     END;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement