9.GYAKORLAT (ADATBÁZISOK)
Témakör: Oracle PL/SQL
témakör 1.gyakorlata: Oracle
Példatár 8.fejezete
- Változóhasználat,
vezérlési szerkezetek a PL/SQL-ben
- PL/SQL
doksi: Oracle
Database Rel.12.2 - PL/SQL
Language Reference
>> List
of Examples (PL/SQL Lang.Ref.12.2) -- példákhoz: create_hr_tables.txt
> SQL/PSM, PL/SQL: SQL4.pdf
(2020.tavaszi AB1EA/HajasCs. 8.ea PL/SQL)
> Az első PL/SQL gyakorlaton az
ún. "Eljut feladat" rekurzív lekérdezésre írunk
PL/SQL programot. Ehhez az alábbi PL/SQL alapokra lesz szükségünk:
-- Változóhasználat, Vezérlési
szerkezetek: feltételes utasítások, ciklusok,
-- DML utasítások, egy sort
visszaadó SELECT INTO használata
programban.
> Viszont a több sort visszaadó
SELECT-re a
kurzorok használata
köv.órán,
a PL/SQL haladó
témaköreit
pedig majd két hét múlva tanuljuk,
lépésenként.
> Eljut feladat: Előző (az II.ZH után) 8.gyakorlaton Eljut-feladat, Rekurzió
>> SQL5.pdf
(2020.tavaszi AB1EA/HajasCs. 10.ea
végén)
-- Ehhez jaratok
tábla: jaratok_tabla.txt
-- -- -- --
1.rész:
PL/SQL
alapjai, PL/SQL
blokk >> 2.fej. PL/SQL alapok
[1_deklarációs_rész] 2_végrehajtható_rész [3_kivételkezelő_rész]
SET SERVEROUTPUT ON;
>> példa-2-24
deklarációk-és-értékadás, típusok, %TYPE, %ROWTYPE
>> példa-2-25 select-into (itt
a 2-25
példában blokk: begin ... end; /
át kell tenni az end;-et
a végére!) SELECT
INTO-t akkor használjuk,
ha a
lekérdezés pontosan egy sort
ad, ha a
lekérdezés
több sorral
tér vissza, akkor kurzort kell
használni,
lásd köv.gyakorlat anyagát).
>> példa6-1
DML utasítások a programban (Eljut feladathoz csak INSERT)
(köv.gyak. DML
utasítások, implicit kurzor, kurzorattribútumok,
folyt.köv.)
>> (összefoglaló) 02_tipusok.pdf; 03_sql_dml.pdf; 05_valtozok.pdf
2.rész:
Feltételes utasítások,
ciklusok >> 4.fej. PL/SQL vezérlő utasítások
>> példa-4-4 if-then-elsif
utasítás (ebben a példában
is van pl. eljárás)
>> példa-4-6
egyszerű case utasítás, és itt
írjuk át grade
:= 'B' ->
'&B'
próbáljuk ki
helyettesítési
változóra: a
felhasználó adja meg az
értékét!
>> példa-4-10
alap LOOP ciklus utasítás EXIT WHEN
kilépés a ciklusból
>> példa
4-15 FOR ciklus utasítás
>> példa
4-28 WHILE ciklus utasítás
>>
(összefoglaló) 01_bevezetes.pdf; pl_02_vezerlo_utasitasok.txt
-- -- -- --
> PL/SQL
FELADATSOR --1:
-- A feladatokat most is a
saját
Dolgozo-Osztaly táblákra kell
megírni, ehhez
a
táblákat létrehozó script,
mint a DML-hez volt: createDolg
(no
constraint)
-- A PL/SQL blokk
előtt
minden alkalommal állítsuk be: SET SERVEROUTPUT ON
1.) Az első
feladat: Írjuk ki PL/SQL
blokkból: 'Szia Világ!'
2.) Írjuk ki KING
fizetését
(olvasás táblából
változóba), abban az esetben,
ha
ismert, hogy pontosan egy
KING nevű dolgozó szerepel a
táblában,
lásd példa-2-25 select-into (csak
ha a
lekérdezés pontosan egy sort
ad).
3.) Az
"Eljut
feladat"
megvalósítása
Oracle PL/SQL-ben
SQL-ben
lásd 8.gyakorlaton;
és (2020.tavaszi 10.ea végén) SQL5.pdf
--
Ezzel a scripttel jaratok_tabla.txt
készítsünk saját
táblát.
> Rek1.feladat: Mely
(x, y)
várospárokra lehetséges
egy vagy több átszállással
eljutni x
városból y városba? -- Ehhez
készítsünk egy Eljut(honnan,
hova)
táblát,
a sorait a járatok
tábla alapján PL/SQL programmal
töltsük fel (ciklust szervezni,
az insert 2.alakja:
több sor felvitele
alkérdéssel/járatok és
eljut táblák alapján).
>>> (csak ha
kell, egy kis
segítség, további ötletek
és a
megoldás vázlata: itt)
> Rek2.feladat: Mely
(x,y)
város
párokra hány
átszállással és
milyen költségekkel
lehetséges egy
vagy több
átszállással eljutni x
városból y városba? -- Ehhez
is
készítsünk Eljut2(honnan,
hova,
atszallas, koltseg) táblát, a sorait
programmal.
>> Papíron
megoldandó feladat: Fejezzük
ki az SQL-1999-es szabvány SELECT
WITH RECURSIVE
utasítással, hogy mely mely
városokba (hova) tudunk eljutni
'DAL'
(Dallas)-ból legfeljebb 3
átszállással és
legfeljebb 5000
költségből.
>>> (csak ha kell, egy kis
segítség WITH RECURSIVE
papíros részéhez itt)
>> Szorgalmi feladatok:
> Rek3.feladat: Tegyük
fel, hogy nemcsak
az
érdekel, hogy el tudunk-e jutni az
egyik
városból a másikba, hanem az
is, hogy
utazásunk
során az átszállások is
ésszerűek legyenek, ez azt
jelenti, hogy
ha több
járattal utazunk, akkor nézni
kell
átszálláskor az
érkező
járatnak legalább
egy órával a
rákövetkező indulás
előtt meg
kell
érkeznie. (Tegyük fel, hogy nincs
egy
napnál hosszabb utazás!)
> Rek4.feladat:
(később, 11.gyak.) A
fenti feladatokat oldjuk meg PL/SQL-ben
úgy is, hogy ne
csak a
várospárokat, hanem a teljes
útvonalat is
listázzuk ki.
Házi feladatok PL/SQL feladatok gyakorlása a következő gyakorlatra:
> Oracle
Példatár Feladatok.pdf
8.fejezet 8.1-8.9.feladatok
8.1. Feladat: Határozza meg egy PL/SQL program
segítségével a felhasználó
által megadott telephelyen dolgozók
bérösszegét.
8.2. Feladat: Írjon PL/SQL programot, amely meghatározza, hogy a
felhasználó
által megadott nevű és
korú személy hány év múlva lesz,
illetve hány éve
már nagykorú. A
kiírást valósítsa meg a PL/SQL blokkon
belül.
8.3. Feladat: Állítsa elő a felhasználó által
megadott darabszámig a Fibonacci
sorozat elemeit (0, 1, 1, 2, 3,
5,...). A megoldáshoz LOOP-ciklust használjon.
8.4. Feladat: Írjon PL/SQL programot, amely a felhasználó
által megadott
telephelyen kiszámítja a legnagyobb
fizetési különbséget.
A feladatot oldja meg SQL
és PL/SQL nyelven.
8.5. Feladat: Írjon PL/SQL programot, amely bekér két
egész számot, és kiírja
a legnagyobb
közös osztójukat. Használjon WHILE-ciklust.
8.6. Feladat: Írjon programot, mely egy PL/SQL blokkban
kiszámítja a felhasználó
által
megadott A számtól a szintén
felhasználó által megadott B számig a
páratlan számok négyzetösszegét.
Használjon FOR-ciklust.
8.7. Feladat: Írjon szkript programot, amely előállítja,
és egymást követő sorokba
kiírja a
felhasználó által megadott két egész
szám összes közös osztóját.
Például 18 és 24 esetén: 1, 2, 3, 6.
8.8. Feladat: Írjon programot, mely előállítja,
és kiírja a felhasználó által
megadott két egész szám közül
legalább az egyikkel osztható első 11
különböző számot. Például 3
és 4 esetén: 3, 4, 6, 8, 9, 12, 15, 16, 18, 20, 21.
8.9. Feladat: Írjon programot, mely előállítja,
és kiírja a felhasználó által
megadott
két egész szám legkisebb közös
többszörösét. Például 8 és
12 esetén: 24.