Adatbázisok EA+GY - Rekurzió, SQL használata programban
> Adatbázisok 7.EA (Rekurzió)
> Adatbázisok 8.EA (SQL/PSM, PL/SQL)
> Oracle PL/SQL: Oracle
Junior EA
>> Oracle
PL/SQL.pdf
> SQL/PSM ---
Ullman-Widom Tankönyv 9.3-9.4.fejezetei
alapján
-- Tk.9.3. SQL/PSM: Osztott
változók, lekérdezések
és kurzorok
-- Tk.9.4. Tárolt
eljárások és
függvények,
kivételkezelés
> Oracle PL/SQL
segédanyagok: ebben
az eduPLSQL mappában
-- Tankönyvtár: PL/SQL
programozás Oracle 10g-ben (Gábor
A.-Juhász I.)
> Oracle PL/SQL
doksi: Oracle 11gR2 doc PL/SQL
Language Reference
-- -- -- --
1/7.rész:
PL/SQL
alapjai, PL/SQL
blokk
szerkezete
>> 2.fej.
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
>> 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, implicit
kurzor
>> példa-6-4
implicit kurzor attribútumok
-- -- -- --
2/7.rész:
Vezérlési
szerkezetek a PL/SQL-ben 4.fej.
Control Statements
PL/SQL
alapjaihoz kiegészítés: Alprogramok
(tárolt
eljárások/függvények)
>> példa2-19
Alprogramok (már itt is vannak: 2.fej. Alapok)
>> példa4-1
Alprogramok IF-THEN utasítás
példában (4.fej.
Utasítások)
Vezérlési
szerkezetek: Feltételes utasítások,
ciklusok
>> példa-4-5 if-then-elsif
utasítás,
>> példa-4-6
egyszerű case utasítás, és itt
írjuk át grade
:= 'B' ->
'&B'
helyettesítési
változóra, aminek 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-14 FOR ciklus utasítás
>> példa
4-27 WHILE ciklus utasítás
-- -- -- --
>> Oracle
PL/SQL.pdf (és
összefoglalók) plsql_01_bevezetes.pdf,
02_vezerlo_utasitasok.txt, 02_tipusok.pdf, 03_dml.pdf, 05_valtozok.pdf
--- Ez volt az
előkészítés az Eljut feladat
megoldásához, lásd
köv.3/6.részt.
-- -- -- --
3/7.rész:
Az "Eljut
feladat"
megvalósítása
PL/SQL-ben
-- Adatbázisok 7.EA
-- Az Eljut-feladat a Tankönyv
(Ullman-Widom kék
könyv) 10.2 szakaszára épül
-- Adott Jaratok(legitarsasag,
honnan, hova, koltseg, indulas, erkezes) táblában
repülőjáratok
adatait
tároljuk (honnan-hova várospárok). Azt
keressük, hogy
Dallasból
mely városokba tudunk eljutni
(közvetlenül vagy
egy/több átszállással).
>> 3.3.1. SQL szabvány szerint (csak papíron)
(konkrét
adatbázis-kezelő rendszerekben eltérő
megvalósítások)
WITH RECURSIVE eljut(honnan, hova) AS
(SELECT honnan, hova FROM jaratok
UNION
SELECT eljut.honnan, jaratok.hova
FROM eljut, jaratok
WHERE eljut.hova = jaratok.honnan)
SELECT hova FROM eljut WHERE honnan='DAL';
--- Kérdés: itt miért fontos kiemelni az UNION (halmaz)
és
UNION
ALL (multihalmaz) közötti
különbséget?
>> 3.3.2. Az Eljut feladat gépes megvalósítása Oracle-ben:
-- Ezzel a scripttel jaratok_tabla.txt
készítsünk saját
táblát.
-- A fenti szabvány SQL megoldás csak egy kis
változtatással
fut le gépes
környezetben! Például Oracle
11gR2 megoldás:
with
eljut (honnan, hova) as
(select honnan, hova from
jaratok
union all
select jaratok.honnan,
eljut.hova
from jaratok, eljut
where
jaratok.hova=eljut.honnan
)
SEARCH DEPTH FIRST BY honnan SET SORTING
CYCLE honnan SET is_cycle TO 1 DEFAULT 0
select distinct honnan, hova from eljut order by honnan;
-- Példák az Oracle
SQL
Language Reference 11.2.pdf
dokumentációban:
>>
Rekurzió
with-utasítással: Recursive
Subquery Factoring: Examples
>> 3.3.3. Hierarchikus lekérdezésekre Oracle megoldás (8.ea.pdf legvégén)
> SQL Lang.Ref: Hierarchical
Queries, Hierarchical
Query Examples
SELECT ... FROM... WHERE ... START WITH ... CONNECT BY PRIOR ...
>> 3.3.4. Nézzük meg hogyan tudjuk PL/SQL-ben megvalósítani:
> 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)
> 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: 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.
-- -- -- --
4/7.rész: Kurzorok
deklarálása és használata
>> 6.fej.
Static SQL/Cursors
>> példa-6-7
explicit kurzorok deklarálása
és használata, lásd 5.feladat,
>> példa-6-11-től 6-14
explicit kurzor attribútumok, lásd 6.feladat,
>> példa-6-17
paraméteres kurzorok, lásd 7-8.feladat,
>> példa-6-43 for
update kurzor módosításhoz,
lásd 9-10.feladat.
>>
(összefoglaló) (volt:03_sql_dml.pdf), 13_kurzorok.pdf,
pl03_cursor.txt
5/7.rész: PL/SQL
kivétel- és
hibakezelés >> 11.fej.
PL/SQL Error Handling
>> példa-11-5
és tábla-11-2
előre definiált kivételek
>> példa-11-8
felhasználó által definiált
kivételek
>>
(összefoglaló) plsql_07_kivetelek.pdf,
Kivételekre_példa
6/7.rész: PL/SQL eljárások
és
függvények >> 8.fej.
PL/SQL Subprograms
>> példa2-19
Alprogramok (már itt is volt függvény:
2.fej. Alapok)
>> példa4-1
IF-THEN utasítás (már itt is volt
eljárás:
4.fej. Utasítások)
>>
(összefoglaló) plsql_06_alprogramok.pdf, Alprogramokra_példa
>> (elemi
programozási feladatok alprogramokra) feladatok.txt
7/7.rész:
Triggerek