ZADANIE 1
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;
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;
1. A - [ex_job_not_exists EXCEPTION] B - [EXCEPTION
ex_job_not_exists] C - [THROWS ex_job_not_exists] D [ex_job_not_exists THROWS]
2. E - [RAISE ex_job_not_exists] F - [THROW ex_job_not_exists] G [ALERT ex_job_not_exists]
3. H -[WHEN ex_insufficient_emp_salary THEN] I -[IF
ex_insufficient_emp_salary THEN] J - [IF EXCEPTION
ex_insufficient_emp_salary] K - [WHEN EXCEPTION
ex_insufficient_emp_sal THEN]
ZADANIE2
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_insufficient_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
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;
1. A - [ex_insufficient_emp_salary EXCEPTION] B-[EXCEPTION
ex_insufficient_emp_salary] C= [THROWS ex_insufficient_emp_salary]
2. D - [RAISE ex_insufficient_emp_salary] E - [THROW
ex_insufficient_emp_salary] F - [ALERT ex_insufficient_emp_salary]
3. G -[WHEN ex_insufficient_emp_salary THEN] H -[IF
ex_insufficient_emp_salary THEN] I - [IF EXCEPTION
ex_insufficient_emp_salary] J - [WHEN EXCEPTION
ex_insufficient_emp_sal THEN]
3. G -[WHEN ex_insufficient_emp_salary THEN] H -[IF
ex_insufficient_emp_salary THEN] I - [IF EXCEPTION
ex_insufficient_emp_salary] J - [WHEN EXCEPTION
ex_insufficient_emp_sal THEN]
ZADANIE 3 - niedokończone
Napisz blok anonimowy PL/SQL, który będzie wykonywał następujące
operacje:
1. W zewnętrznym bloku zdefiniuj dwie zmienne: v_numerator oraz
v_denominator.
2. W bloku wewnętrznym (zagnieżdżonym) wykonaj dzielenie tych
zmiennych i zapisz wynik do zmiennej v_result.
3. Obsłuż wyjątek ZERO_DIVIDE w bloku wewnętrznym – w przypadku
dzielenia przez zero wypisz odpowiedni komunikat.
4. W bloku wewnętrznym zdefiniuj również wyjątek własny
e_invalid_data, który będzie rzucany, jeśli v_denominator będzie
mniejszy od zera.
5. Jeśli wyjątek e_invalid_data nie zostanie obsłużony wewnątrz,
powinien zostać przechwycony przez zewnętrzny blok, gdzie zostanie
wypisany komunikat o błędzie danych wejściowych.
DECLARE
liczba NUMBER := &liczba;
dzielenie NUMBER := &dzielenie;
ex_za_mala_liczba EXCEPTION;
BEGIN
dbms_output.put_line('start');
DECLARE
wynik NUMBER;
BEGIN
IF dzielenie < 0 THEN
RAISE ex_za_mala_liczba;
END IF;
wynik := liczba / dzielenie;
dbms_output.put_line(wynik);
EXCEPTION
WHEN ZERO_DIVIDE THEN
dbms_output.put_line('Dzielenie przez zero!');
END;
EXCEPTION
WHEN ex_za_mala_liczba THEN
dbms_output.put_line('Liczba jest za mala');
END;