wtorek, 8 kwietnia 2025
Kolokwium - Wyjątki
Zadanie 4
Napisz procedurę która przyjmuje jako parametr identy kator pracownika (p_empno) typu NUMBER.
1.
Procedura ma wyszukać pracownika o podanym identy katorze w tabeli emp oraz jego bonus
z tabeli bonus.
2.
Jeśli pracownik o podanym numerze nie istnieje — procedura powinna obsłużyć wyjątek i
wyświetlić komunikat:
"Nie znaleziono pracownika o numerze X."
3.
Jeśli więcej niż jeden pracownik ma taki numer (błąd w danych) — obsłuż wyjątek i wyświetl
komunikat:
"Znaleziono wielu pracowników o numerze X – dane są niepoprawne."
4.
•
•
Po odnalezieniu pracownika:
policz jego łączne zarobki (pensja + bonus),
jeżeli pensja przekracza 5000, zgłoś wyjątek użytkownika ex_salary_too_high i wyświetl
komunikat:
"Zarobki pracownika X przekraczają dopuszczalny limit."
CREATE OR REPLACE PROCEDURE sprawdz_zarobki_pracownika(p_empno NUMBER) IS
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
v_bonus bonus.bonus%TYPE;
v_wyplata NUMBER;
BEGIN
SELECT e.ename, e.sal, b.bonus
INTO v_ename, v_sal, v_bonus
FROM emp e
JOIN bonus b ON e.empno = b.empno
WHERE e.empno = p_empno;
v_wyplata := NVL(v_sal, 0) + NVL(v_bonus, 0);
IF v_wyplata > 5000 THEN
— — DRUGIE MIEJSCE MIEJSCE DO WYBORU
END IF;
DBMS_OUTPUT.PUT_LINE('Pracownik: ' || v_ename);
DBMS_OUTPUT.PUT_LINE('Łączne zarobki: ' || v_wyplata);
EXCEPTION
— — — TRZECIE MIEJSCE AŻ DO END MIEJSCE DO WYBORU
DBMS_OUTPUT.PUT_LINE('Nie znaleziono pracownika o numerze ' || p_empno);
— — — CZWARTE MIEJSCE
fi
fi
1
DBMS_OUTPUT.PUT_LINE('Znaleziono wielu pracowników o numerze ' || p_empno || ' – dane są
niepoprawne.');
WHEN ex_salary_too_high THEN
DBMS_OUTPUT.PUT_LINE('Zarobki pracownika ' || p_empno || ' przekraczają dopuszczalny
limit.');
END;
A. THROWS ex_salary_too_high
B. ex_salary_too_high THROWS
C. ex_salary_too_high EXCEPTION ✅
D. RAISEABLE ex_salary_too_high
E. THROW ex_salary_too_high
F. ALERT ex_salary_too_high
G. RAISE ex_salary_too_high ✅
H. THROW_EXCEPTION ex_salary_too_high
I. WHEN DATA_NOT_FOUND THEN
J. WHEN NOT_FOUND THEN
K. WHEN NO_DATA_FOUND THEN ✅
L. WHEN NO_DATA THEN
M. WHEN EXCEPTION_TOO_MANY_ROWS THEN
N. WHEN ROWS_TOO_MANY THEN
O. WHEN UNEXPECTED_ROW_COUNT THEN
P. WHEN TOO_MANY_ROWS THEN ✅
————————————————————————————————
Utwórz procedurę o nazwie wypisz_zarobki_pracownikow, która dla każdego pracownika
wypisze jego łączne zarobki (czyli suma pensji podstawowej i bonusu). Dane powinny
pochodzić z tabeli pracownicy, zawierającej m.in. kolumny imie, pensja_podst oraz bonus.
Jeśli łączne zarobki pracownika będą mniejsze niż 1100, procedura ma przerwać działanie i
zgłosić wyjątek o nazwie ex_insu cient_emp_salary, a następnie wyświetlić komunikat o
zbyt niskich zarobkach.
CREATE OR REPLACE PROCEDURE procedura IS
CURSOR kursor IS
SELECT emp.empno, SUM(NVL(emp.sal,0)+NVL(bonus.bonus,0)) as wyplata
FROM emp
JOIN bonus ON emp.empno = bonus.empno
GROUP BY emp.empno
ORDER BY emp.empno DESC;
—— 1
rekord kursor%ROWTYPE;
BEGIN
ffi
2
OPEN kursor;
LOOP
FETCH kursor INTO rekord;
EXIT WHEN kursor%NOTFOUND;
dbms_output.put_line(rekord.empno||' - '||rekord.wyplata);
IF (rekord.wyplata) < 1100 THEN
CLOSE kursor;
—— 2
END IF;
END LOOP;
CLOSE kursor;
EXCEPTION
—— 3
dbms_output.put_line('Wyjątek: Pracownik z zarobkami ponizej minimalnej pensji');
END;
A. ex_insu cient_emp_salary EXCEPTION ✅
B. EXCEPTION ex_insu cient_emp_salary
C. THROWS ex_insu cient_emp_salary
D. DECLARE_EXCEPTION ex_insu cient_emp_salary
E. THROW ex_insu cient_emp_salary
F. RAISE ex_insu cient_emp_salary ✅
G. ALERT ex_insu cient_emp_salary
H. SIGNAL ex_insu cient_emp_salary
I. WHEN ex_insu cient_emp_salary THEN ✅
J. IF ex_insu cient_emp_salary THEN
K. WHEN EXCEPTION ex_insu cient_emp_sal THEN
L. IF EXCEPTION ex_insu cient_emp_salary THEN
——————————————————————————————————
Utwórz funkcję, która przyjmuje dwa parametry: nazwę stanowiska pracownika (emp.job),
nazwę departamentu (emp.dept). Oblicza i zwraca średnią zarobków pracowników, którzy
pracują na podanym stanowisku w danym departamencie. Jeśli w podanym departamencie
nie występuje żaden pracownik na wskazanym stanowisku – funkcja powinna wyrzucić
wyjątek o nazwie ex_job_not_exists.
CREATE OR REPLACE FUNCTION funkcja(stanowisko emp.job%TYPE, departament
emp.deptno%TYPE) RETURN NUMBER AS
srednia_zarobkow NUMBER;
CURSOR kursor(c_stanowisko emp.job%TYPE, c_departament emp.deptno%TYPE) IS
SELECT AVG(emp.sal) as srednia
FROM emp
WHERE emp.deptno = c_departament AND emp.job = c_stanowisko; --zapytanie
——— 1
rekord kursor%ROWTYPE;
ffi
ffi
ffi
ffi
ffi
ffi
ffi
ffi
ffi
ffi
ffi
ffi
3
BEGIN
OPEN kursor(stanowisko,departament);
FETCH kursor INTO rekord;
IF rekord.srednia IS NULL THEN
CLOSE kursor;
——— 2
END IF;
CLOSE kursor;
RETURN rekord.srednia;
EXCEPTION
——— 3
dbms_output.put_line('Nie ma takiego stanowiska w podanym departamencie');
RETURN NULL;
END;
A. ex_job_not_exists EXCEPTION ✅
B. EXCEPTION ex_job_not_exists
C. THROWS ex_job_not_exists
D. DECLARE_EXCEPTION ex_job_not_exists
E. THROW ex_job_not_exists
F. RAISE ex_job_not_exists ✅
G. ALERT ex_job_not_exists
H. SIGNAL ex_job_not_exists
I. WHEN ex_job_not_exists THEN ✅
J. IF ex_job_not_exists THEN
K. WHEN EXCEPTION ex_job_not_exists THEN
L. IF EXCEPTION ex_job_not_exists THEN
4