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
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.
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 10.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 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
14.) 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.
15.) 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.
További
gyakorló feladatok találhatóak
az Oracle
Példatárban
-- Lásd Feladatok.pdf (10.fejezet
feladatai)
-- Ehhez: a táblák
létrehozása cr_dept_emp.sql