-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprocedures.sql
More file actions
124 lines (105 loc) · 3.17 KB
/
procedures.sql
File metadata and controls
124 lines (105 loc) · 3.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/* Język SQL. Rozdział 11.Procedury – zadania */
-- 1
CREATE OR REPLACE PROCEDURE podwyzka (p_id_zesp IN NUMBER, p_procent IN NUMBER DEFAULT 15) IS
BEGIN
UPDATE pracownicy
SET placa_pod = placa_pod + placa_pod * p_procent / 100
WHERE id_zesp = p_id_zesp;
END podwyzka;
-- 2
CREATE OR REPLACE PROCEDURE podwyzka (p_id_zesp IN NUMBER, p_procent IN NUMBER DEFAULT 15) IS
excBrakZesp EXCEPTION;
tmp NUMBER := 0;
BEGIN
SELECT COUNT(*) INTO tmp
FROM PRACOWNICY
WHERE id_zesp = p_id_zesp;
IF tmp = 0 THEN
RAISE excBrakZesp;
END IF;
UPDATE pracownicy
SET placa_pod = placa_pod + placa_pod * p_procent / 100
WHERE id_zesp = p_id_zesp;
EXCEPTION
WHEN excBrakZesp THEN
dbms_output.put_line('Blad. Nie ma zespolu o id ' || to_char(p_id_zesp));
WHEN OTHERS THEN
dbms_output.put_line('Wystpail inny blad');
END podwyzka;
-- 3
CREATE OR REPLACE PROCEDURE LICZBA_PRACOWNIKOW (p_zesp IN ZESPOLY.NAZWA%TYPE, p_wynik OUT NUMBER) IS
excZlaNazwa EXCEPTION;
tmp NUMBER := 0;
BEGIN
SELECT COUNT(*) INTO tmp
FROM zespoly
WHERE nazwa = p_zesp;
IF tmp = 0 THEN
RAISE excZlaNazwa;
END IF;
SELECT COUNT(*) INTO p_wynik
FROM PRACOWNICY
JOIN ZESPOLY USING(id_zesp)
WHERE nazwa = p_zesp;
EXCEPTION
WHEN excZlaNazwa THEN
dbms_output.put_line('Blad. Nie znaleziono zespolu o nazwie ' || p_zesp);
END liczba_pracownikow;
-- 4
CREATE OR REPLACE PROCEDURE nowy_pracownik (
p_nazwisko IN PRACOWNICY.NAZWISKO%TYPE,
p_zespol IN ZESPOLY.NAZWA%TYPE,
p_szef IN PRACOWNICY.NAZWISKO%TYPE,
p_placa IN PRACOWNICY.PLACA_POD%TYPE
) IS
excBrakZespolu EXCEPTION;
excBrakSzefa EXCEPTION;
tmp NUMBER := 0;
v_id_zesp PRACOWNICY.ID_ZESP%TYPE;
v_id_szefa PRACOWNICY.ID_SZEFA%TYPE;
BEGIN
SELECT COUNT(*) INTO tmp
FROM zespoly
WHERE nazwa = p_zespol;
IF tmp = 0 THEN
RAISE excBrakZespolu;
END IF;
SELECT COUNT(*) INTO tmp
FROM pracownicy
WHERE nazwisko = p_szef;
IF tmp = 0 THEN
RAISE excBrakSzefa;
END IF;
SELECT id_zesp INTO v_id_zesp
FROM zespoly
WHERE nazwa = p_zespol;
SELECT id_prac INTO v_id_szefa
FROM pracownicy
WHERE nazwisko = p_szef;
INSERT INTO pracownicy
VALUES (pracseq.nextVal, p_nazwisko, 'STAZYSTA', v_id_szefa, SYSDATE, p_placa, NULL, v_id_zesp);
EXCEPTION
WHEN excBrakZespolu THEN
dbms_output.put_line('Blad. Nie znaleziono zespolu o nazwie ' || p_zespol);
WHEN excBrakSzefa THEN
dbms_output.put_line('Blad. Nie znaleziono szefa (brak pracownika ' || p_szef || ')');
WHEN OTHERS THEN
dbms_output.put_line('Wystapil nieobslugiwany wyjatek');
END nowy_pracownik;
-- 5
CREATE OR REPLACE FUNCTION placa_netto (
p_placa IN NUMBER,
p_podatek IN NUMBER DEFAULT 20
) RETURN NUMBER IS
v_podatek NUMBER := p_placa - p_placa * p_podatek / 100;
BEGIN
RETURN v_podatek;
END placa_netto;
-- 6
CREATE OR REPLACE FUNCTION silnia (n IN NUMBER) RETURN NUMBER IS
wynik NUMBER := 1;
BEGIN
FOR i IN 1..n LOOP
wynik := wynik * i;
END LOOP;
RETURN wynik;