Trigger 1. feladat ------------------ /* * Trigger, ami csak bizonyos feltételek esetén engedi meg * a beszúrást, egyébként megakadályozza azt. * * Feltétel: * - csak létező dolgozó adható meg főnökként * - csak már létező munkakör adható meg * - új dolgozó az azonos munkakörben dolgozókkal * szemben csak alacsonyabb fizetést kaphat */ Bánkeszi Ádám megoldása felhasználói hibaüzenet generálásával ------------------------------------------------------------- CREATE OR REPLACE TRIGGER INSERT_CONSTRAINT BEFORE INSERT ON emp FOR EACH ROW DECLARE fonok_letezik NUMBER; munkakor_letezik NUMBER; min_fizetes NUMBER; BEGIN -- főnök létezésének vizsgálata SELECT COUNT(*) INTO fonok_letezik FROM emp WHERE EMPNO = :NEW.MGR; IF (fonok_letezik != 1) THEN RAISE_APPLICATION_ERROR(-20010, 'Nem létezik ilyen dolgozó kódú főnök!'); END IF; -- munkakör létezésének vizsgálata SELECT COUNT(*) INTO munkakor_letezik FROM emp WHERE JOB = :NEW.JOB; IF (munkakor_letezik < 1) THEN RAISE_APPLICATION_ERROR(-20011, 'Nem létezik ilyen munkakör!'); END IF; -- fizetés ellenőrzése SELECT MIN(sal) INTO min_fizetes FROM emp WHERE JOB = :NEW.JOB; IF (:NEW.SAL >= min_fizetes) THEN RAISE_APPLICATION_ERROR(-20012, 'Új dolgozó csak alacsonyabb fizetést kaphat az azonos munkakörben dolgozókhoz képest!'); END IF; END; -- főnök hiba tesztelése INSERT INTO emp VALUES (1111, 'TEST', 'CLERK', 1000, SYSDATE, 1, 10, 10); -- munkakör hiba tesztelése INSERT INTO emp VALUES (1111, 'TEST', 'TEST', 7839, SYSDATE, 1, 10, 10); -- fizetés hiba tesztelése INSERT INTO emp VALUES (1111, 'TEST', 'CLERK', 7839, SYSDATE, 99999, 10, 10); Papp Norbert megoldása kivételkezeléssesel ------------------------------------------ CREATE OR REPLACE TRIGGER feladat BEFORE INSERT ON emp FOR EACH ROW DECLARE minim EMP.SAL%TYPE; mgrvane INTEGER; jobvane INTEGER; sokfizetes EXCEPTION; nincsjob EXCEPTION; nincsmgr EXCEPTION; BEGIN SELECT COUNT(*) INTO mgrvane FROM EMP WHERE empno = :NEW.mgr; SELECT COUNT(*) INTO jobvane FROM EMP WHERE job = :NEW.job; SELECT MIN(sal) INTO minim FROM EMP WHERE job = :NEW.job; IF minim <= :NEW.sal THEN RAISE sokfizetes; ELSIF mgrvane = 0 THEN RAISE nincsmgr; ELSIF jobvane = 0 THEN RAISE nincsjob; END IF; EXCEPTION WHEN sokfizetes THEN DBMS_OUTPUT.PUT_LINE('Túl sok fizetés! Azonos munkakörű dolgozóknál csak kisebb fizetést kaphat!'); WHEN nincsmgr THEN DBMS_OUTPUT.PUT_LINE('Nincs ilyen dolgozó az adatbázisban! Csak létező dolgozó adható meg főnökként!'); WHEN nincsjob THEN DBMS_OUTPUT.PUT_LINE('Nincs ilyen munkakör! Csak már létező adható meg!'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Egyéb hiba'); END; /