Áttekintés:
- Az 1-2. gyakorlat lekérdezéseit
először
természetes nyelven fogalmaztuk meg, majd
"táblákban gondolkodva" azt
néztük meg, hogyan mely
táblából milyen műveletekkel
tudjuk megkapni az
eredménytáblát, ezt
megadtuk relációs
algebrában (halmazokon).
- Ezután a 3-4. gyakorlaton SQL SELECT
utasítással (multihalmazokon) fejeztük
ki
ugyanezeket a
lekérdezéseket. Az 5-6. gyakorlaton
néztünk
további lehetőségeket
az SQL SELECT-ben, majd
kiterjesztettük a
relációs algebrát erre a
lehetőségekre.
- A mai gyakorlaton visszatérünk az 1-2.
gyakorlatok relációs
algebrai lekérdezéseire
és a
lekérdezéseket
fejezzük
ki (nem rekurzív) biztonságos Datalog
szabályokkal.
Segédanyag:
- Relációs
algebra Datalog átírása vezérfonala: AB1_Datalog_pp25_27.pdf
- Tankönyvben
[Ullman-Widom] 5.3-5.4.
Datalog
szabályok és
lekérdezések
Megjegyzés: A rekurziót a
következő gyakorlaton
tárgyaljuk, például a
tranzitív
lezárt
nem fejezhető ki
relációs algebrában, viszont
rekurzív
Datalog programmal megadható.
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.
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 9.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