Advertisement
Guest User

Untitled

a guest
Jul 21st, 2017
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 2.58 KB | None | 0 0
  1. CREATE OR REPLACE TRIGGER PruefeArbeiten
  2. BEFORE
  3. INSERT ON Arbeiten
  4. FOR EACH ROW
  5. DECLARE
  6.   vThema Arbeiten.Thema%TYPE;
  7.   vArbeitsid Arbeitstyp.ArbeitsID%TYPE;
  8.   vDatum Arbeiten.Pruefungsdatum%TYPE;
  9.   vMaxAnzahlMitglieder NUMERIC;
  10.   vGruppennr NUMERIC;
  11.   vAktAnzahlGruppenmitglieder NUMERIC;
  12.   vArbeitExistiert NUMERIC;
  13.   vArbeitstyp NUMERIC;
  14.   vAktDatum DATE;
  15. BEGIN
  16.   vThema := :NEW.thema;
  17.   vArbeitsID := :NEW.arbeitsid;
  18.   vDatum := :NEW.pruefungsdatum;
  19.  
  20.   -- 1. Fall: Pruefen, ob das Thema bereits existiert mit anderem Pruefungsdatum und -art
  21.   SELECT COUNT(*) INTO vArbeitExistiert FROM Arbeiten
  22.   WHERE thema = vThema
  23.   AND
  24.     -- Unterschiedliche Arbeitsid und gleiches Pruefungsdatum
  25.     (arbeitsid != vArbeitsid AND pruefungsdatum = vDatum)
  26.     OR
  27.     -- Gleiche Arbeitsid und unterschiedliches Pruefungsdatum
  28.     (arbeitsid = vArbeitsid AND pruefungsdatum != vDatum);
  29.  
  30.   IF vArbeitExistiert >= 1 THEN
  31.       raise_application_error(-20001, 'Thema darf nicht genutzt werden.');
  32.   END IF;  
  33.  
  34.  
  35.   -- 2. Fall: Ein Student moechte sich zu einer bereits existierenden Arbeit hinzufuegen
  36.   SELECT COUNT(*) INTO vArbeitExistiert FROM Arbeiten WHERE arbeitsid = vArbeitsID AND thema = vThema AND pruefungsdatum = vDatum;
  37.  
  38.   IF vArbeitExistiert >= 1 THEN
  39.       -- Die Arbeit gibt es bereits. Muss zu einer Gruppe hinzugefuegt werden.
  40.      
  41.       -- Gruppe ermitteln
  42.       SELECT Gruppennr INTO vGruppennr FROM Arbeiten WHERE arbeitsid = vArbeitsID AND thema = vThema AND pruefungsdatum = vDatum;
  43.       -- Aktuelle Anzahl Mitglieder der Gruppe ermitteln
  44.       SELECT COUNT(*) INTO vAktAnzahlGruppenmitglieder FROM Gruppe WHERE Gruppennr = vGruppennr;
  45.      
  46.       -- Arbeitstypen: 1 = Projektarbeit / 2 = Bachelorarbeit / 3 = Masterarbeit
  47.       CASE vArbeitsID
  48.         WHEN 1 THEN
  49.           -- Projektarbeit, max. drei Mitglieder
  50.           vMaxAnzahlMitglieder := 3;
  51.         WHEN 2 THEN
  52.           vMaxAnzahlMitglieder := 2;
  53.         WHEN 3 THEN
  54.           vMaxAnzahlMitglieder := 2;
  55.       END CASE;
  56.      
  57.       IF vAktAnzahlGruppenmitglieder >= vMaxAnzahlMitglieder THEN
  58.         -- Der Student darf der Gruppe nicht mehr beitreten
  59.         raise_application_error(-20001, 'Maximale Anzahl an Gruppenmitgliedern erreicht.');
  60.       END IF;
  61.   END IF;
  62.  
  63.   -- Note darf erst eingetragen werden, wenn das aktuelle Dateum >= Pruefungsdatum ist
  64.   IF :NEW.Note != NULL THEN
  65.     SELECT CURRENT_DATE INTO vAktDatum FROM dual;
  66.     IF vAktDatum < :NEW.Pruefungsdatum THEN
  67.       raise_application_error(-20001, 'Pruefungsdatum noch nicht erreicht.');
  68.     END IF;
  69.   END IF;
  70.  
  71. END;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement