Gyakorló feladatok
az Oracle
Példatárból -- Ehhez: cr_dept_emp.sql
Lásd Példatár
"10.fejezet. Kivételkezelés, alprogramok, triggerek"
feladatai
5a_kivetelkez.sql
-
Feladat kivételkezelésre
- Írjunk egy olyan
eljárást,
amely kivételkezelést is tartalmaz és
a jutalmat az
emp
táblából
létrehozott dolgozo tábla jutalék
(comm)
értékéhez adja
hozzá!
A jutalom a
dolgozó fizetésének 10%-a,
feltéve, ha a fizetés 3000
dollár
alatt van,
egyébként csak egy
"Boldog Karácsonyt!" üdvözletet
kap.
3.6. Triggerek (ez nem szerepel a zh-n a
számonkérésen)
A triggerek
témakör
(Tankönyv 7.5. szakasza) az előadáson szerepelt,
illetve
később, az MSc gyakorlaton is foglalkozunk
még
részletesebben a triggerekkel.
-- PL/SQL Language Reference 11gR2 >> 9.fej. Triggers
Gyakorló feladatok
az Oracle
Példatárból -- Ehhez: cr_dept_emp.sql
Lásd Példatár
"10.fejezet. Kivételkezelés, alprogramok, triggerek"
feladatai
6a_trigger.sql
- triggerek
- Hozzunk létre BEFORE triggert, amely
megakadályozza a munkaidőn
kívüli
adatmanipulációkat
az emp táblán! Írassuk ki, milyen
műveleteket
kíséreltek meg
végrehajtani munkaidőn kívül!
6b_triggerek.sql
-
triggerek
- Írjunk triggert (és
ellenőrizzük is a működését),
amely megakadályozza
az elnökre (president)
vonatkozó törlő,
beszúró és
adatmódosító
DML utasítások
működését! (a tesztelő script
programban
a hivatkozási
megszorítás
felfüggesztése illetve a
végén
az újbóli engedélyeztetése) PL/SQL
FELADATOK-2 --
Táblák
és
az eddigi sql feladatok: table_dolgozo.txt
-- Ehhez a táblák
létrehozása: create_dolgozo.txt
Az előző heti feladatok folytatása, lásd 8.gyak.#plsql_feladatok-1
(aki azt még nem fejezte be, előbb azokat írja
meg
és utána ezeket).
10.) Módosítsuk a fizetéseket egy
kurzorral
végighaladva rajtuk!
Adjunk hozzá
mindenki
fizetéséhez n*10 ezret, ahol n a
nevében
levő magánhangzók
száma (a, e, i, o, u)!
(módosítás kurzorral,
beépített
függvények)
11.) Írjunk meg egy package-beli
függvényt, ami
visszaadja
a
paraméterében levő
magánhangzók számát!
Módosítsuk a
fizetéseket ennek a függvénynek a
segítségével.
(UPDATE
utasítással, és
nem plsql-ben) (package)
12.) Írjunk meg egy csomagot (package-et), amelyben van egy
TIPUS(input_szoveg IN
VARCHAR2)
nevű
függvény, amelyik a
paraméterül kapott
karakterláncról
eldönti,
hogy az numerikus
érték,
dátum, vagy egyik sem, azaz csak
szövegként
értelmezhető! A
dátumok
esetén elég ha a függvény
egyetlen
dátum-
formátumot (pl.
az
alapértelmezettet) felismer. A függvény
által visszaadott
érték legyen mondjuk: 1, 2,
illetve 3, a parameter
típusának megfelelően.
A
függvényt
próbáljuk is ki procedurális
utasításokban is és SQL
utasításokban is! Pl. valtozo
:= <package_nev>.tipus(parameter);
SELECT
oszlop1,
<package_nev>.tipus(oszlop1) FROM tabla_nev
formában. Ehhez
vigyük fel egy
tábla karakteres oszlopába a következő
adatokat: '1240', '12A3',
'Blabla',
'2008-04-19', '12.5', '2008-apr-19'
(Használhatjuk az
Oracle
konverziós függvényeit plusz a
hibakezelést.)
13.) Írjunk meg egy package-beli
procedúrát
vagy függvényt, ami
különböző
típusú
input
paraméterek esetén lényegesen
eltérően
működik! (túlterhelés)
Például: p(13) ->
szám, p('abc') -> szöveg, p('2008-02-02')
->
dátum
Szorgalmi
feladatok (ebben a félévben a triggerek nem
lesznek a számonkérésben)
+1.) Az alábbi
feladatokhoz hozzunk létre az emp, dept
és
salgrade tábláknak
megfelelő
magyar nyelvű (de
ékezet
nélküli) oszlopnevekkel rendelkező
dolgozo, osztaly
és fizufokozat
táblákat különböző
megszorításokkal
együtt.
- Az eredeti táblák
felhasználásával
töltsük fel a
táblákat
a megszorításoknak
eleget tevő adatsorokkal
(megszorítások ellenőrzése: DBA_CONSTRAINTS)
- Az előző feladatban
létrehozott
saját DOLGOZO
nevű táblához hozzunk
létre egy TRIGGER_LOG1
nevű táblát, aminek a következő a
szerkezete:
(
idopont DATE,
muvelet
VARCHAR2(20),
esemeny
VARCHAR2(80)
)
- Hozzunk létre egy (after) triggert,
ami akkor
aktivizálódik ha a
dolgozo tábla
fizetés oszlopát
módosítják! A trigger a
következő műveleteket
végezze el:
- Ha a dolgozo új fizetése
nagyobb lesz mint 4000 akkor erről tegyen egy
bejegyzést a
trigger_log
táblába. Az esemény oszlopba
írja be a
régi és
az új
fizetést is.
- Az elnök (foglalkozas = 'PRESIDENT')
fizetését ne engedje
módosítani.
A
módosítás után a
fizetés maradjon a régi. Erről is tegyen
egy
bejegyzést
a trigger_log
táblába. Az
esemény oszlopba írja be, hogy a
fizetés
nem változott.
+2.) Hozzunk létre egy TRIGGER_LOG2 nevű
táblát is, aminek a szerkezete
a
következő:
(
idopont DATE,
muvelet
VARCHAR2(20),
uj_osszfiz NUMBER
)
- Hozzunk létre egy
triggert,
ami akkor
aktivizálódik ha a dolgozo
táblára
valamilyen módosító
műveletet
(INSERT,
DELETE,
UPDATE)
hajtanak végre! A
trigger
irja be a TRIGGER_LOG2
táblába
a
módosítás
időpontját, a
műveletet és az új
összfizetést.
- Ha az új
összfizetés nagyobb lenne mint
40000, akkor a trigger utasítsa
vissza a
módosító műveletet, és
hibaüzenetként küldje vissza,
hogy
'Túl nagy
összfizetés'. Ez esetben naplóznia sem
kell. Gyakorló
feladatok: Azokat
a feladatokat, amelyekre az órán nem maradt idő,
gyakorló
feladatként otthon önállóan be lehet fejezni
és emailben be lehet küldeni!