Advertisement
sirzielarz

Untitled

Jun 29th, 2020
384
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 4.61 KB | None | 0 0
  1. /* Dane są tabele:
  2. STUDENT {IdStudenta Int PK, NrIndeksu Varchar2(10), Rok Int, Imie Varchar2(32), Nazwisko Varchar2(64)}
  3. OCENA {IdOceny Int PK, IdStudenta  FK, Wartosc Int, Przedmiot Varchar2(32).
  4. 1.  W bloku PL/SQL przejrzyj wszystkich studentów 2 roku, wypisując średnią każdego z nich oraz kasując studentów (i ich oceny), którzy mają średnią poniżej 2,5. W tabeli nie jest włączone kaskadowe usuwanie.
  5. 2.  Napisz wyzwalacz, który:
  6. >Pozwoli na zmianę roku jedynie o 1 w górę,
  7. >nie pozwoli na wpisanie roku wyższego niż 5. */
  8.  
  9. --ddl
  10.  
  11. DROP TABLE OCENA;
  12. DROP TABLE STUDENT;
  13. /
  14.  
  15. CREATE TABLE STUDENT
  16. (
  17.     IdStudenta INT PRIMARY KEY,
  18.     NrIndeksu  VARCHAR2(10) NOT NULL,
  19.     Rok        INT          NOT NULL,
  20.     Imie       VARCHAR2(32) NOT NULL,
  21.     Nazwisko   VARCHAR2(64) NOT NULL
  22. )
  23. /
  24. CREATE TABLE OCENA
  25. (
  26.     IdOceny    INT PRIMARY KEY,
  27.     IdStudenta INT NOT NULL REFERENCES STUDENT,
  28.     Wartosc    INT NOT NULL,
  29.     Przedmiot  VARCHAR2(32)
  30. )
  31. /
  32.  
  33. --dml
  34.  
  35. INSERT INTO STUDENT (IDSTUDENTA, NRINDEKSU, ROK, IMIE, NAZWISKO)
  36. VALUES (1, 'S00001', 1, 'Adam', 'Małysz');
  37. INSERT INTO STUDENT (IDSTUDENTA, NRINDEKSU, ROK, IMIE, NAZWISKO)
  38. VALUES (2, 'S00002', 2, 'Mariusz', 'Pudzianowski');
  39. INSERT INTO STUDENT (IDSTUDENTA, NRINDEKSU, ROK, IMIE, NAZWISKO)
  40. VALUES (3, 'S00003', 3, 'Robert', 'Kubica');
  41. INSERT INTO STUDENT (IDSTUDENTA, NRINDEKSU, ROK, IMIE, NAZWISKO)
  42. VALUES (4, 'S00004', 2, 'Zbigniew', 'Stonoga');
  43. INSERT INTO STUDENT (IDSTUDENTA, NRINDEKSU, ROK, IMIE, NAZWISKO)
  44. VALUES (5, 'S00005', 5, 'Leo', 'Messi');
  45. /
  46.  
  47. INSERT INTO OCENA (IdOceny, IdStudenta, Wartosc, Przedmiot)
  48. VALUES (1, 1, 3, 'Matematyka');
  49. INSERT INTO OCENA (IdOceny, IdStudenta, Wartosc, Przedmiot)
  50. VALUES (2, 1, 2, 'Matematyka');
  51. INSERT INTO OCENA (IdOceny, IdStudenta, Wartosc, Przedmiot)
  52. VALUES (3, 1, 5, 'Matematyka');
  53. INSERT INTO OCENA (IdOceny, IdStudenta, Wartosc, Przedmiot)
  54. VALUES (4, 1, 4, 'Matematyka');
  55. INSERT INTO OCENA (IdOceny, IdStudenta, Wartosc, Przedmiot)
  56. VALUES (5, 2, 3, 'Matematyka');
  57. INSERT INTO OCENA (IdOceny, IdStudenta, Wartosc, Przedmiot)
  58. VALUES (6, 2, 2, 'Matematyka');
  59. INSERT INTO OCENA (IdOceny, IdStudenta, Wartosc, Przedmiot)
  60. VALUES (7, 2, 2, 'Matematyka');
  61. INSERT INTO OCENA (IdOceny, IdStudenta, Wartosc, Przedmiot)
  62. VALUES (8, 2, 2, 'Matematyka');
  63. INSERT INTO OCENA (IdOceny, IdStudenta, Wartosc, Przedmiot)
  64. VALUES (9, 3, 3, 'Matematyka');
  65. INSERT INTO OCENA (IdOceny, IdStudenta, Wartosc, Przedmiot)
  66. VALUES (10, 3, 5, 'Matematyka');
  67. INSERT INTO OCENA (IdOceny, IdStudenta, Wartosc, Przedmiot)
  68. VALUES (11, 4, 4, 'Matematyka');
  69. INSERT INTO OCENA (IdOceny, IdStudenta, Wartosc, Przedmiot)
  70. VALUES (12, 4, 3, 'Matematyka');
  71. INSERT INTO OCENA (IdOceny, IdStudenta, Wartosc, Przedmiot)
  72. VALUES (13, 5, 4, 'Matematyka');
  73.  
  74. --zad1
  75.  
  76. DECLARE
  77.     v_student INT;
  78.     v_rok     INT;
  79.     v_srednia NUMBER := 0;
  80.     CURSOR cur_oceny IS SELECT IdStudenta, Rok
  81.                         FROM STUDENT;
  82. BEGIN
  83.     OPEN cur_oceny;
  84.     LOOP
  85.         FETCH cur_oceny INTO v_student, v_rok;
  86.         EXIT WHEN cur_oceny%NOTFOUND;
  87.  
  88.         SELECT NVL(AVG(Wartosc), 0) INTO v_srednia FROM OCENA WHERE IdStudenta = v_student;
  89.         IF v_rok = 2 THEN
  90.             DBMS_OUTPUT.PUT_LINE('SREDNIA STUDENTA ID ' || v_student || ' WYNOSI ' || v_srednia);
  91.         END IF;
  92.         IF v_srednia < 2.5 THEN
  93.             DELETE FROM OCENA WHERE IdStudenta = v_student;
  94.             DELETE FROM STUDENT WHERE IdStudenta = v_student;
  95.         END IF;
  96.     END LOOP;
  97.     CLOSE cur_oceny;
  98. END;
  99.  
  100. --zad2
  101.  
  102. CREATE OR REPLACE TRIGGER year_trigg
  103.     BEFORE INSERT OR UPDATE
  104.     ON STUDENT
  105.     FOR EACH ROW
  106. DECLARE
  107.     v_newYear STUDENT.Rok%TYPE;
  108. BEGIN
  109.     v_newYear := :NEW.Rok;
  110.     IF INSERTING THEN
  111.         IF v_newYear > 5 THEN
  112.             RAISE_APPLICATION_ERROR
  113.                 (-20100, 'Nie mozna wstawic roku wiekszego niz 5');
  114.         END IF;
  115.     ELSIF UPDATING THEN
  116.         IF (v_newYear - :old.Rok > 1 OR v_newYear - :old.Rok < 0) THEN
  117.             :NEW.Rok := :old.Rok;
  118.             --DBMS_OUTPUT.PUT_LINE('NIE MOZNA PRZESKOCZYC O WIECEJ NIZ 1 ROK');
  119.             RAISE_APPLICATION_ERROR
  120.                 (-20100, 'NIE MOZNA PRZESKOCZYC O WIECEJ NIZ 1 ROK LUB COFNAC SIE');
  121.  
  122.         ELSIF v_newYear > 5 THEN
  123.             :NEW.Rok := :old.Rok;
  124.             --DBMS_OUTPUT.PUT_LINE('Nie mozna dac roku wiekszego niz 5');
  125.             RAISE_APPLICATION_ERROR
  126.                 (-20100, 'NIE MOZNA WSTAWIC ROKU WIEKSZEGO NIZ 5');
  127.         END IF;
  128.     END IF;
  129. END;
  130.  
  131. UPDATE STUDENT
  132. SET ROK = 6
  133. WHERE IDSTUDENTA = 5;
  134.  
  135. INSERT INTO STUDENT (IdStudenta, NrIndeksu, Rok, Imie, Nazwisko)
  136. VALUES (6, 's2137', 6, 'Jerzy', 'Delbana');
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement