2.6. Tárolt eljárások, függvények, aktív elemek

2.6.1. Tárolt eljárások

2.6.1.1. Oracle csomagok, eljárások, függvények

2.6.1.1.1. Hozzon létre PL/SQL csomagot, amely a „vevő” táblát kezeli: adatfelvitelt, adatmódosítást, adattörlést valósítson meg!
   CREATE OR REPLACE PACKAGE vevo_csomag AS
      PROCEDURE insert_vevo (ugy IN vevo.ugyfelszam%TYPE, n IN 
        vevo.nev%TYPE, e IN vevo.e_mail%TYPE, t IN vevo.tel%TYPE, ir IN vevo.i%TYPE, va IN vevo.v%TYPE, ut IN vevo.u%TYPE, haz IN vevo.hsz%TYPE);
      PROCEDURE delete_vevo (ugy IN vevo.ugyfelszam%TYPE);
      PROCEDURE update_vevo (ugy IN vevo.ugyfelszam%TYPE, n IN 
       vevo.nev%TYPE, e IN vevo.e_mail%TYPE, t IN vevo.tel%TYPE, ir IN vevo.i%TYPE, va IN vevo.v%TYPE, ut IN vevo.u%TYPE, haz IN vevo.hsz%TYPE);
   END vevo_csomag;
2.6.1.1.2. Hozza létre a csomagtörzset az 6.1.1/1. feladatban létrehozott csomaghoz!
   CREATE OR REPLACE PACKAGE BODY vevo_csomag AS
     PROCEDURE insert_vevo (ugy IN vevo.ugyfelszam%TYPE, n IN 
      vevo.nev%TYPE, e IN vevo.e_mail%TYPE, t IN vevo.tel%TYPE, ir IN vevo.i%TYPE, va IN vevo.v%TYPE, ut IN vevo.u%TYPE, haz IN vevo.hsz%TYPE) AS
     BEGIN
        INSERT INTO vevo VALUES(ugy, n, e, t, ir, va, ut, haz);
     END;
     PROCEDURE delete_vevo (ugy IN vevo.ugyfelszam%TYPE) AS
     BEGIN
        DELETE FROM vevo WHERE ugyfelszam = ugy;
     END;
     PROCEDURE update_vevo (ugy IN vevo.ugyfelszam%TYPE, n IN 
       vevo.nev%TYPE, e IN vevo.e_mail%TYPE, t IN vevo.tel%TYPE, ir IN vevo.i%TYPE, va IN vevo.v%TYPE, ut IN vevo.u%TYPE, haz IN vevo.hsz%TYPE) AS
     BEGIN
        UPDATE vevo SET nev = n, e_mail = e, tel = t, i = ir, v = va, u = ut, hsz = haz WHERE ugyfelszam = ugy;
     END;
   END vevo_csomag;
2.6.1.1.3. Hozzon létre PL/SQL csomagot, amely a „szolgáltató” táblát kezeli: adatfelvitelt, adatmódosítást, adattörlést valósítson meg!
   CREATE OR REPLACE PACKAGE szolgaltato_csomag AS
     PROCEDURE insert_szolgaltato (ca IN 
       szolgaltato.cegazonosito%TYPE, n IN szolgaltato.nev%TYPE, ir IN szolgaltato.i%TYPE, va IN szolgaltato.v%TYPE, ut IN szolgaltato.u%TYPE, haz IN szolgaltato.hsz%TYPE);
     PROCEDURE delete_szolgaltato (ca IN 
       szolgaltato.cegazonosito%TYPE);
     PROCEDURE update_szolgaltato (ca IN 
      szolgaltato.cegazonosito%TYPE, n IN szolgaltato.nev%TYPE, ir IN szolgaltato.i%TYPE, va IN szolgaltato.v%TYPE, ut IN szolgaltato.u%TYPE, haz IN szolgaltato.hsz%TYPE);
   END szolgaltato_csomag;
2.6.1.1.4. Hozza létre a csomagtörzset az 6.1.1/3. feladatban létrehozott csomaghoz!
   CREATE OR REPLACE PACKAGE BODY szolgaltato_csomag AS
     PROCEDURE insert_szolgaltato (ca IN 
      szolgaltato.cegazonosito%TYPE, n IN szolgaltato.nev%TYPE, ir IN szolgaltato.i%TYPE, va IN szolgaltato.v%TYPE, ut IN szolgaltato.u%TYPE, haz IN szolgaltato.hsz%TYPE) IS
     BEGIN
         INSERT INTO szolgaltato VALUES(ca, n, ir, va, ut, haz);
     END;
     PROCEDURE delete_szolgaltato (ca IN szolgaltato.cegazonosito%TYPE) IS
     BEGIN
         DELETE FROM szolgaltato WHERE cegazonosito = ca;
     END;
     PROCEDURE update_szolgaltato (ca IN 
      szolgaltato.cegazonosito%TYPE, n IN 
      szolgaltato.nev%TYPE, ir IN szolgaltato.i%TYPE, va IN szolgaltato.v%TYPE, ut IN szolgaltato.u%TYPE, haz IN szolgaltato.hsz%TYPE) IS
     BEGIN
         UPDATE szolgaltato SET nev = n, i = ir, v = va, u = ut, 
         hsz = haz WHERE cegazonosito = ca;
     END;
   END szolgaltato_csomag;
2.6.1.1.5. Hozzon létre PL/SQL csomagot, amely a „mobiltelefon” táblát kezeli: adatfelvitelt, adatmódosítást, adattörlést valósítson meg!
   CREATE OR REPLACE PACKAGE mobiltelefon_csomag AS
     PROCEDURE insert_mobiltelefon (csz IN 
       mobiltelefon.cikkszam%TYPE, l IN mobiltelefon.leiras%TYPE, a IN mobiltelefon.ar%TYPE, t IN mobiltelefon.tipusa%TYPE);
     PROCEDURE delete_mobiltelefon (csz IN 
      mobiltelefon.cikkszam%TYPE);
     PROCEDURE update_mobiltelefon (csz IN 
      mobiltelefon.cikkszam%TYPE, l IN mobiltelefon.leiras%TYPE, a IN mobiltelefon.ar%TYPE, t IN mobiltelefon.tipusa%TYPE);
   END mobiltelefon_csomag;
2.6.1.1.6. Hozza létre a csomagtörzset az 6.1.1/5. feladatban létrehozott csomaghoz!
   CREATE OR REPLACE PACKAGE BODY mobiltelefon_csomag AS
     PROCEDURE insert_mobiltelefon (csz IN 
      mobiltelefon.cikkszam%TYPE, l IN mobiltelefon.leiras%TYPE, a IN mobiltelefon.ar%TYPE, t IN mobiltelefon.tipusa%TYPE) AS
     BEGIN
        INSERT INTO mobiltelefon VALUES(csz, l, a, t);
     END;
     PROCEDURE delete_mobiltelefon (csz IN 
      mobiltelefon.cikkszam%TYPE) AS
     BEGIN
        DELETE FROM mobiltelefon WHERE cikkszam = csz;
     END;
     PROCEDURE update_mobiltelefon (csz IN 
        mobiltelefon.cikkszam%TYPE, l IN mobiltelefon.leiras%TYPE, a IN mobiltelefon.ar%TYPE, t IN mobiltelefon.tipusa%TYPE) AS
     BEGIN
        UPDATE mobiltelefon SET leiras = l, ar = a, tipusa = t 
        WHERE cikkszam = csz;
     END;
   END mobiltelefon_csomag;
2.6.1.1.7. Hozzon létre PL/SQL csomagot, amely a „tel” táblát kezeli: adatfelvitelt, adatmódosítást, adattörlést valósítson meg!
   CREATE OR REPLACE PACKAGE tel_csomag AS
      PROCEDURE insert_tel (i IN tel.id%TYPE, tsz IN 
        tel.telszam%TYPE, sz IN tel.szolgaltato%TYPE);
      PROCEDURE delete_tel (i IN tel.id%TYPE);
      PROCEDURE update_tel (i IN tel.id%TYPE, tsz IN 
        tel.telszam%TYPE, sz IN tel.szolgaltato%TYPE);
   END tel_csomag;
2.6.1.1.8. Hozza létre a csomagtörzset az 6.1.1/7. feladatban létrehozott csomaghoz!
   CREATE OR REPLACE PACKAGE BODY tel_csomag AS
     PROCEDURE insert_tel (i IN tel.id%TYPE, tsz IN 
      tel.telszam%TYPE, sz IN tel.szolgaltato%TYPE) AS
     BEGIN
        INSERT INTO tel VALUES(i, tsz, sz);
     END;
     PROCEDURE delete_tel (i IN tel.id%TYPE) AS
     BEGIN
        DELETE FROM tel WHERE id = i;
     END;
     PROCEDURE update_tel (i IN tel.id%TYPE, tsz IN 
        tel.telszam%TYPE, sz IN tel.szolgaltato%TYPE) AS
     BEGIN
        UPDATE tel SET telszam = tsz WHERE id = i;
        UPDATE tel SET szolgaltato = sz WHERE id = i;
     END;
   END tel_csomag;
2.6.1.1.9. Hozzon létre PL/SQL csomagot, amely az „elégedettség” kapcsoló táblát kezeli: adatfelvitelt, adatmódosítást, adattörlést, elégedettség jelleg lekérdezést valósítson meg!
   CREATE OR REPLACE PACKAGE elegedettseg_csomag AS
     PROCEDURE insert_elegedettseg (az IN
      elegedettseg.azonosito%TYPE, j IN elegedettseg.jellege%TYPE, v IN elegedettseg.vevo%TYPE, sz IN elegedettseg.szolgaltato%TYPE);
     PROCEDURE delete_elegedettseg (az IN
      elegedettseg.azonosito%TYPE);
     PROCEDURE update_elegedettseg (az IN 
      elegedettseg.azonosito%TYPE, j IN elegedettseg.jellege%TYPE, v IN elegedettseg.vevo%TYPE, sz IN elegedettseg.szolgaltato%TYPE);
     FUNCTION elegedettseg_jelleg (az IN
      elegedettseg.azonosito%TYPE) RETURN  elegedettseg.jellege%TYPE;
   END elegedettseg_csomag;
2.6.1.1.10. Hozza létre a csomagtörzset az 6.1.1/9. feladatban létrehozott csomaghoz!
   CREATE OR REPLACE PACKAGE BODY elegedettseg_csomag AS
     PROCEDURE insert_elegedettseg (az IN 
      elegedettseg.azonosito%TYPE, j IN elegedettseg.jellege%TYPE, v IN elegedettseg.vevo%TYPE, sz IN elegedettseg.szolgaltato%TYPE) AS
     BEGIN
        INSERT INTO elegedettseg VALUES(az, j, v, sz);
     END;
     PROCEDURE delete_elegedettseg (az IN 
      elegedettseg.azonosito%TYPE) AS
     BEGIN
        DELETE FROM elegedettseg WHERE azonosito = az;
     END;
     PROCEDURE update_elegedettseg (az IN 
       elegedettseg.azonosito%TYPE, j IN elegedettseg.jellege%TYPE, v IN elegedettseg.vevo%TYPE, sz IN elegedettseg.szolgaltato%TYPE) AS
     BEGIN
         UPDATE elegedettseg SET jellege = j, vevo = v, 
         szolgaltato = sz WHERE azonosito = az;
     END;
     FUNCTION elegedettseg_jelleg (az IN 
       elegedettseg.azonosito%TYPE) RETURN  elegedettseg.jellege%TYPE AS
       j elegedettseg.jellege%TYPE;
     BEGIN
        SELECT jellege INTO j FROM elegedettseg WHERE 
         azonosito = az;
        RETURN  j;
     END;
   END elegedettseg_csomag;
2.6.1.1.11. Hozzon létre PL/SQL csomagot, amely az „árusít” kapcsoló táblát kezeli: adatfelvitelt, adatmódosítást, adattörlést valósítson meg!
   CREATE OR REPLACE PACKAGE arusit_csomag AS
     PROCEDURE insert_arusit (i IN arusit.id%TYPE, d IN 
      arusit.db%TYPE, sz IN arusit.szolgaltato%TYPE, m IN arusit.mobiltelefon%TYPE);
     PROCEDURE delete_arusit (i IN arusit.id%TYPE);
     PROCEDURE update_arusit (i IN arusit.id%TYPE, d IN 
      arusit.db%TYPE, sz IN arusit.szolgaltato%TYPE, m IN arusit.mobiltelefon%TYPE);
   END arusit_csomag;
2.6.1.1.12. Hozza létre a csomagtörzset az 6.1.1/11. feladatban létrehozott csomaghoz!
   CREATE OR REPLACE PACKAGE BODY arusit_csomag AS
     PROCEDURE insert_arusit (i IN arusit.id%TYPE, d IN 
      arusit.db%TYPE, sz IN arusit.szolgaltato%TYPE, m IN arusit.mobiltelefon%TYPE) AS
     BEGIN
         INSERT INTO arusit VALUES(i, d, sz, m);
     END;
     PROCEDURE delete_arusit (i IN arusit.id%TYPE) AS
     BEGIN
         DELETE FROM arusit WHERE id = i;
     END;
     PROCEDURE update_arusit (i IN arusit.id%TYPE, d IN 
       arusit.db%TYPE, sz IN arusit.szolgaltato%TYPE, m IN arusit.mobiltelefon%TYPE) AS
     BEGIN
        UPDATE arusit SET db = d, szolgaltato = sz, 
        mobiltelefon = m WHERE id = i;
     END;
   END arusit_csomag;
2.6.1.1.13. Írjon tárolt eljárást, amely beszúr egy rekordot a vevő táblába a 3 kötelező mezőt kitöltve!
   CREATE OR REPLACE PROCEDURE vevo_beszur(v_num NUMBER, v_nev VARCHAR, 
       v_mail VARCHAR) IS
   BEGIN
      INSERT INTO vevo (ugyfelszam, nev, e_mail) VALUES (v_num, v_nev,   v_mail);
   END vevo_beszur;
           
   --Futtatása:
   BEGIN
       vevo_beszur(44556677, 'Valaki', '');
   END;
2.6.1.1.14. Írjon tárolt eljárást, amely a vevők neveit átírja csupa nagybetűsre, majd hívja meg az eljárást!

   CREATE OR REPLACE PROCEDURE vn_upperc (v1 IN vevo.nev%TYPE, v2 OUT 
      vevo.nev%TYPE) AS
   BEGIN
      v2:=UPPER(v1);
   END vn_upperc;
   
   DECLARE
           CURSOR c_upperc IS SELECT * FROM vevo;
           n1 vevo.nev%TYPE;
           n2 vevo.nev%TYPE;
   BEGIN
           FOR v IN c_upperc LOOP
                   n1:=v.nev;
                   vn_upperc(n1,n2);
                   DBMS_OUTPUT.PUT_LINE(n1 || ', ' ||  n2);
           END LOOP;
   END;
2.6.1.1.15. Írjon tárolt eljárást, amely kilistázza és megszámolja az adatbázisban szereplő szolgáltatókat!
   CREATE OR REPLACE PROCEDURE sorszam IS 
           CURSOR c IS SELECT nev FROM szolgaltato;
           sorok_szama NUMBER;
   BEGIN
           FOR i IN c LOOP
               sorok_szama := c%ROWCOUNT;
               DBMS_OUTPUT.PUT_LINE(i.nev);
           END LOOP;
           DBMS_OUTPUT.PUT_LINE('--');
           IF sorok_szama > 0 THEN
               DBMS_OUTPUT.PUT_LINE(sorok_szama||' szolgaltato van az adatbazisban.');
           ELSE
               DBMS_OUTPUT.PUT_LINE('Nincs elerheto szolgaltato.');
           END IF;
   END sorszam;
   
   BEGIN
           sorszam;
   END;
2.6.1.1.16. Írjon tárolt eljárást, amely a 25000 Ft-nál olcsóbb telefonok árát 20%-kal megnöveli!
   CREATE OR REPLACE PROCEDURE ar_modosit IS
     CURSOR cAr IS SELECT * FROM mobiltelefon WHERE ar < 25000 FOR 
     UPDATE OF ar;
           BEGIN
           FOR i IN cAr LOOP
                UPDATE mobiltelefon SET ar = ar * 1.2 WHERE CURRENT OF cAr;
           END LOOP;
   END ar_modosit;
   
   BEGIN
           ar_modosit;
   END;
2.6.1.1.17. Írjon tárolt függvényt, amely visszaadja a legdrágább telefon árát!
    CREATE OR REPLACE FUNCTION telefon_maxar RETURN  NUMBER IS
        t_ar mobiltelefon.ar%TYPE;
    BEGIN
           SELECT max(ar) INTO t_ar FROM mobiltelefon;
           IF t_ar IS NOT NULL THEN
               return  t_ar;
           ELSE
               return  0;
           END IF;
    END;
2.6.1.1.18. Írjon függvényt, amely visszaadja a paraméterében kapott vevő nevéhez tartozó e-mail címet!
    CREATE OR REPLACE FUNCTION v_email (n IN vevo.nev%TYPE) RETURN  
         vevo.e_mail%TYPE AS 
       v_em vevo.e_mail%TYPE;
    BEGIN
        SELECT e_mail INTO v_em FROM vevo WHERE nev = n;
        IF v_em IS NOT NULL THEN
            return  v_em;
        ELSE
            return  null;
        END IF;
    END;
           
2.6.1.1.19. Írjon függvényt, mely visszaadja, hogy egy paraméterül átadott azonosítójú szolgáltatóval mennyire elégedettek a vevők!
   CREATE OR REPLACE FUNCTION elegedett(az IN elegedettseg.szolgaltato%TYPE) RETURN  NUMBER IS 
      CURSOR c_j IS SELECT jellege FROM elegedettseg WHERE szolgaltato = az;
      sorok_szama NUMBER;
      pozitiv_j NUMBER := 0;
   BEGIN
      FOR i IN c_j LOOP
           sorok_szama := c_j%ROWCOUNT;
           IF i.jellege = 'pozitiv' THEN
                 pozitiv_j := pozitiv_j + 1;
           END IF;
      END LOOP;
      RETURN  (pozitiv_j/sorok_szama)*100;
   END;
2.6.1.1.20. Írjon függvényt, mely visszaadja, hogy egy adott típusú mobiltelefont hány szolgálató árusít!
   CREATE OR REPLACE FUNCTION tipust_arul(tip IN mobiltelefon.tipusa%TYPE) RETURN  NUMBER IS 
           CURSOR c IS SELECT count(*) darab, szolgaltato FROM arusit, 
                   mobiltelefon WHERE arusit.mobiltelefon = mobiltelefon.cikkszam 
                   AND tipusa = tip GROUP BY szolgaltato;
           db NUMBER := 0;
   BEGIN
           FOR i IN c LOOP
                   db := c%ROWCOUNT;
           END LOOP;
           RETURN  db;
   END;
2.6.1.1.21. Írjon függvényt, mely visszaadja, hogy a vevők hány százaléka elégedett szolgáltatójával!
   CREATE OR REPLACE FUNCTION ossz_elegedett RETURN  NUMBER IS 
           CURSOR c_e IS SELECT jellege FROM elegedettseg;
           sorok_szama NUMBER;
           pozitiv_e NUMBER := 0;
   BEGIN
           FOR i IN c_e LOOP
                   sorok_szama := c_e%ROWCOUNT;
                   IF i.jellege = 'pozitiv' THEN
                           pozitiv_e := pozitiv_e + 1;
                   END IF;
           END LOOP;
           RETURN  (pozitiv_e/sorok_szama)*100;
   END;

2.6.2. Triggerek

2.6.2.1. Hozzon létre triggert, amely naplózza a NAPLO (dátum, esemény) táblába, ha új rendelés érkezik be.

   CREATE TRIGGER tr_naplozo AFTER INSERT ON rendeles
   BEGIN
      INSERT INTO naplo VALUES (sysdate,'Rendelés érkezett');
   END;

2.6.2.2. Futtasa le az előző feladatban létrehozott triggert.

   INSERT INTO rendeles VALUES (...);

2.6.2.3. Naplózza egy NAPLO (szoveg) táblába, ha hozzáférés történik a dolgozó törzstáblához.

   CREATE TRIGGER tr_dolg AFTER INSERTING OR DELETING
   OR UPDATING ON dolgozo
   DECLARE
      szoveg CHAR(100);
   BEGIN
      IF INSERTING THEN
        szoveg := 'Bövítés ' || USER || TO_CHAR(sysdate,'YYYY.MM.DD');
      END IF;
      IF DELETING THEN
        szoveg := 'Törlés ' || USER || TO_CHAR(sysdate,'YYYY.MM.DD');
      END IF;
      IF UPDATETING THEN
        szoveg := 'Módositas ' || USER ||
        TO_CHAR(sysdate,'YYYY.MM.DD');
      END IF;
      INSERT INTO NAPLO VALUES (szoveg),
   END;

2.6.2.4. Módosítsa az első feladat megoldását úgy, hogy az esemény leírásában szerepeljen a termék kódja is (rendeles tábla termek mezője).

   CREATE TRIGGER tr_naplozo2 AFTER INSERT ON rendeles FOR EACH ROW
   BEGIN
      INSERT INTO naplo VALUES (sysdate,'Rendelés érkezett termék:'
      || :NEW.termek);
   END;

2.6.2.5. Oldja meg triggerel, hogy amennyiben egy raktár egy rekesze blokkolt állapotba kerül (STATUS mező = 'B'), akkor az oda allokált termék csomagok is blokkolt státuszba kerüljenek.

   CREATE TRIGGER tr_raktar1 AFTER UPDATE ON RAKTAR_REKESZEK
      FOR EACH ROW
   BEGIN
      IF :OLD.STATUSZ = 'B' THEN
         UPDATE TERMEK_CSOMAGOK SET STATUS = 'B'
         WHERE rekesz=:OLD.id;
      END IF;
   END;

2.6.2.6. Hozzon létre olyan triggert, amely nem engedi, hogy 100000 alatt legyen valamelydolgozónak a fizetése.

   CREATE TRIGGER tr_fizetes1 BEFORE INSERT OR UPDATE OF fizetes
   ON DOLGOZO FOR EACH ROW
   BEGIN
      IF :NEW.fizetes < 100000 THEN
         RAISE_APPLICATION_ERROR (-20010,
        'Túl alacsony fizetes, dolgozókód:' || :NEW.kod);
      END IF;
   END;

2.6.2.7. Készítsen triggert, mely azt felügyeli, hogy az dolgozók jövedelmét nem lehet 50000 Ft-nál nagyobb értékkel növelni.

   CREATE TRIGGER tr_fizetes2 BEFORE UPDATE ON DOLGOZOK FOR EACH ROW
   BEGIN
      IF :NEW.jovedelem > :OLD.jovedelem+5000 THEN
         :NEW.jovedelem := :OLD.jovedelem+5000;
      END IF;
   END;

2.6.2.8. Írjon olyan triggert, amely nem engedi, hogy egy számlafejhez 10-nél több tétel tartozzon.

   CREATE TRIGGER tr_szamla1 BEFORE INSERT ON szamla_tetel
   FOR EACH ROW
   DECLARE
      db NUMBER;
   BEGIN
      SELECT count(*) INTO db
         FROM szamla_tetel WHERE szamlaszam = :NEW.szamlaszam;
      IF db > 9 THEN
         RAISE_APPLICATION_ERROR (-20010,'Túl sok rendelési tétel');
      END IF;
   END;

2.6.2.9. Készítsen triggert, melynek feladata, hogy új fizetés érték esetén automatikusan kiszámítja az adó értékét. Az adó értékét egy adoszamitas nevű tárolt eljárás határozza meg.

   CREATE TRIGGER tr_adoszam AFTER UPDATE OF fizetes ON DOLGOZO
   FOR EACH ROW
   DECLARE
      szamitott_ado EMBER.ADO%TYPE;
   BEGIN
      IF :NEW.jovedelem IS NOT NULL THEN
         adoszamitas(:NEW.jovedelem, szamitott_ado);
        :NEW.ado:=szamitott_ado;
      END IF;
   END;

2.6.2.10. Hozzon létre triggert, mely nem enged 1000-nél kisebb, illetve 10000-nél nagyobb értéket felvinni a termék ár mezőjébe. Hibakezelésen keresztül állítsa be a mező érvényes értékét.

   CREATE TRIGGER tr_fizetes2 BEFORE INSERT OR UPDATE OF fizetes
   ON DOLGOZO FOR EACH ROW
   DECLARE
      sajathiba1 EXCEPTION;
      sajathiba2 EXCEPTION;
   BEGIN
      IF :NEW.ar < 1000 THEN
         RAISE sajathiba1;
      END IF;
      IF :NEW.ar > 10000 THEN
         RAISE sajathiba2;
      END IF;
   EXCEPTION
      WHEN sajathiba1 THEN
        :NEW.ar := 1000;
      WHEN sajathiba2 THEN
        :NEW.ar := 10000;
   END;

2.6.2.11. Készítsen triggert, amely 10% kedvezményt ad a rendelési árból, ha a rendelésértéke nagyobb mint 10000 Ft.

   CREATE TRIGGER tr_rendeles2 BEFORE INSERT ON Rendeles
   FOR EACH ROW
   BEGIN
      IF :NEW.osszar > 10000 THEN
        :NEW.osszar := 0.9 * :NEW.osszar;
      END IF;
   END;

2.6.2.12. Készítsen triggert, amely 10% kedvezményt ad a rendelési árból, ha a vevő eddigi összrendelés értéke nagyobb mint 100000 Ft.

   CREATE TRIGGER tr_rendeles3 BEFORE INSERT ON Rendeles
   FOR EACH ROW
   DECLARE
      mosszar NUMBER;
   BEGIN
      SELECT SUM(osszar) INTO mosszar FROM rendeles
         WHERE ugyfel = :NEW.ugyfel;
      IF mosszar > 10000 THEN
        :NEW.osszar := 0.9 * :NEW.osszar;
      END IF;
   END;

2.6.2.13. Készítsen VIEW-t az összetartozó dolgozó és üzem nevek megjelenítésére. Eztután készítsen olyan triggert, anely ezen VIEW-ra kiadott INSERT parancsot átviszi az üzemre és dolgozóra. Az új rekordok kulcsérétkét egy-egy szekvenciából vegye át.

   CREATE VIEW v1 AS
   SELECT d.nev, u.nev FROM dolgozo d
      INNER JOIN uzem u ON d.uzem = u.kod;
   
   CREATE SEQUENCE s1;
   CREATE SEQUENCE s2;
   
   CREATE TRIGGER tr_view INSTEAD OF INSERT ON v1 FOR EACH ROW
   DECLARE
      mdkod NUMBER;
      mukod NUMBER;
   BEGIN
      INSERT INTO uzem(kod) VALUES (s1.NEXTVAl);
      INSERT INTO dogozo(kod) VALUES (s2.NEXTVAl);
   END;

2.6.2.14. Ne engedjen kitörölni számla rekordot, ha státusza már F értékű.

   CREATE TRIGGER tr_szamla2 BEFORE DELETE ON szamla
   FOR EACH ROW
   BEGIN
      IF :OLD.status = 'Z' THEN
         RAISE_APPLICATION_ERROR (-20010,'Túl sok rendelési tétel');
      END IF;
   END;

2.6.2.15. Ha egy vevőrekordot törölnek, elótte számolja ki az eredő tartozását az egyes rendeléseket összesítve, és írja ki egy ADOSAG nevű álományba a kapott értéket.

   CREATE OR REPLACE TRIGGER tr_adosag BEFORE DELETE
   ON ugyfel FOR EACH ROW
   DECLARE
      osszadosag NUMBER;
   BEGIN
      FOR rend IN (SELECT * FROM rendeles WHERE
         ugyfel = :OLD.ugyfel) 
      LOOP
        osszadosag := osszadosag + rend.adosag;
      END LOOP;
      INSERT INTO adosag VALUES (:OLD.ikod, :OLD.unev, osszadosag);
   END;

2.6.2.16. Készítsen triggert, amely gondoskodik arról, hogy a rendelési tételek alapján a termékhez tartozó összrendelés érték aktuális érték maradjon a rendelés tábla módosulása után is.

   CREATE TRIGGER tr_illeszt AFTER INSERT OR DELETE OR
   UPDATE OF darabszam ON rendeles FOR EACH ROW
   DECLARE
      valt NUMBER;
      tkod rendeles.termek%TYPE;
   BEGIN
      IF INSERTING THEN
         valt := :NEW.darabszam;
         tkod := :NEW.termek;
      END IF;
      IF DELETING THEN
         valt := - :OLD.darabszam;
         tkod := :OLD.termek;
      END IF;
      IF UPDATING THEN
         valt := :NEW.darabszam - :OLD.darabszam;
         tkod := :NEW.termek;
      END IF;
      UPDATE termek SET osszdarab = osszdarab + valt
      WHERE kod = tkod;
   END;

2.6.2.17. Készítsen DDL triggert a séma műveletek naplózására.

   CREATE TRIGGER tr_ddl AFTER DDL ON SCHEMA
   BEGIN
      INSERT INTO naplo VALUES (SYSDATE,
        USER, ora_dict_obj_owner,
        ora_dict_obj_type, ora_dict_obj_name,ora_sysevent
      );
   END;