11.GYAKORLAT (ADATBÁZISOK)
ZH előtti
összefoglalás
kérdés/válasz, a II.ZH információ: [link]
Témakör: Oracle PL/SQL
témakör - Összefoglalás (zh előtti kérdés/válasz)
- Változóhasználat, vezérlési szerkezetek a PL/SQL-ben: Példatár 8.fej.pdf
- Kurzorok, FOR UPDATE kurzor módosításhoz: Oracle
Példatár 9.fej.pdf
- Kivétel-
és hibakezelés, alprogramok: Oracle
Példatár 10.fej.PSM.pdf
- PL/SQL
elsajátításához segédletek:
Az egyetlen megengedett
segédlet, amit a ZH írás alatt
használhatunk:
PL/SQL
doksi: Oracle
Database Rel.12.2 - PL/SQL
Language Reference
>> a
doksiból nézünk példákat:
List
of Examples (PL/SQL Lang.Ref.12.2)
- További
segédanyagok a PL/SQL
feldolgozásához:
>> SQL/PSM, PL/SQL: 08.adatb.ea.pdf
(korábbi BSc-2008 AB1EA/HajasCs.)
>> Oracle
PL/SQL: Oracle
Junior EA
>> Oracle
PL/SQL.pdf
>> Oracle PL/SQL
segédanyagok: eduPLSQL
mappában => innen lásd
például:
>> plsql_progr.pdf
-- Forrás Tankönyvtár: PL/SQL
programozás Oracle-ben
PL/SQL
3.rész:
(folyt.)
DML programban, kurzorok
>> 6.fej.
Static SQL/Cursors
-
Ismétlés: >> példa-2-25 select into >> példa-6-6 és példa-6-11 kurzorok
>> példa-6-41
6.6.6.3 FOR UPDATE
kurzor módosításhoz -
hibák javítása:
-- Ne adjon ki COMMIT
utasítást a FOR UPDATE
módosításra megnyitott
kurzor
lekérdezési ciklusán belül,
mert a ciklus második
lépésében a
FETCH nem
működik olyan kurzorra, amely már nem
érvényes (hiba).
--
Módosítható kurzort
használjunk, ha a sorok értékeit
módosítani vagy
a sorokat
törölni szeretnénk, ekkor
a kurzorban a FOR UPDATE
záredékot használjunk.
Módosítás esetén a FETCH
által utoljára lehívott,
azaz
aktuális sor azonosítása a CURRENT
OF
kurzor záradékkal történik.
-- A végén
zárja be a
kurzort. (Javítsuk ki a fenti hibákat,
próbáljuk ki.)
-- Figyelem! Ennek a
demó
példa lefuttatásánál a
PL/SQL blokk előtti
drop
table emp; create table emp as select * from hr.employees;
felülírja
az Oracle Példatár feladatainál
használt korábbi emp
táblát,
-- ezért emp
helyett emp_temp táblát célszerűbb
használjunk, vagy utána
az Oracle Példatár
feladataihoz: cr_dept_emp.txt
scriptet újra lefuttatjuk.
[Megj.: A
feladatsorban viszont
a korábbi táblákban
dolgozunk: createDolg]
PL/SQL eljárások
és
függvények: 8.fej.
PL/SQL Alprogramok
>> volt példa2-17
Változók hatásköre,
láthatósága, élettartalma
(2.fej. Alapok)
>> volt példa4-1
IF-THEN utasítás (például
már itt is volt
eljárás:
4.fej. Utasítások)
>> 8.1.
Alprogramokról áttekintés:
Miért van szükség alprogramokra,
előnyök
>> 8.5.fej.
Példák példa8-1
PL/SQL eljárásra és példa8-2
PL/SQL függvényre
>>
8.7.fej. Paraméterátadás; 8.9.fej.Túlterhelés
példa8-26
túlterhelésre példa
PL/SQL
kivétel- és
hibakezelés >> 11.fej. Kivétel-és
hibakezelés
>>
táblázat-11-3
előre definiált kivételek
(Predefined Exceptions) Táblázat
>> példa-11-3
példa előre definiált NO_DATA_FOUND hiba
kezelésére
>> példa11-6
példa előre definiált ZERO_DIVIDE (egyszerű
névtelen blokk)
>> példa-11-10 példa
felhasználó által
definiált kivételekre)
--
Javítások: CREATE PROCEDURE helyett CREATE OR
REPLACE PROCEDURE
--
és az
utasításrészben, ahol
TO_DATE('01-JUL-2010',
'DD-MON-YYYY') kieg.:
TO_DATE('01-JUL-2010', 'DD-MON-YYYY', 'NLS_DATE_LANGUAGE =
American')
PL/SQL
FELADATSOR --3:
-- 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 képernyőre való kiíráshoz
a
DBMS_OUTPUT.PUT_LINE() használatához,
a PL/SQL blokk
előtt állítsuk be: SET SERVEROUTPUT ON
-- -- -- --
-- 11.)
/* FOR UPDATE kurzor módosításhoz,
lásd példa-6-41
(javítását lásd fentebb)
Módosítható explicit kurzor
használatával növeljük meg a
hivatalnokok
(CLERK)
fizetését a saját
fizetésük 20%-ával! (SQL DML feladatokra másolat dolg2 tábla)
-- Ennek egy lehetséges
megoldását lásd az Oracle
Példatár 9.1.példa
-- Oracle Példatár
feladataihoz/példáihoz: cr_dept_emp.txt (angol ny.
séma)
-- mi viszont ezekre a
táblákra magyar nyelvű
sémával
dolgozunk: createDolg
*/
-- -- -- --
-- 12.)
/* FOR UPDATE
kurzor módosításhoz
Módosítsuk a
dolgozók
nevét
írjuk át, hogy csak a kezdőbetű legyen
nagy,
a többi betű kicsi, továbbá a
dolgozók fizetését is
növeljük meg 2 %-kal!
*/
-- -- -- --
-- 13.)
/* Módosítás kurzorral
Írjunk meg egy procedúrát, amelyik
módosítja a paraméterében
megadott
osztályon
a fizetéseket, és kiírja a
dolgozó nevét és új
fizetését.
A módosítás mindenki
fizetéséhez adjon hozzá n*10 ezret,
ahol n a dolgozó nevében levő
magánhangzók száma (A, E, I, O, U).
A procedúra a kiírás után
adjon ki egy ROLLBACK utasítást, hogy
megmaradjanak
az eredeti fizetések, így a
procedúrát többször is futtatni
tudják.
*/
CREATE OR REPLACE PROCEDURE fiz_mod2(p_oazon INTEGER) IS
Tesztelés:
set serveroutput on
execute fiz_mod2(10);
-- -- -- --
-- 14.)
/* Exception
Írjunk meg egy függvényt, amelyik egy
karakteres típusú paraméterben egy
dátumot kap a következő formátumban:
'éééé.hh.nn' vagy
'nn.hh.éééé'.
A függvény adja vissza a nap nevét, pl.
'kedd'.
Ha a megadott karakterlánc nem egy
érvényes dátum, akkor adja vissza,
hogy 'rossz dátum'.
*/
CREATE OR REPLACE FUNCTION nap_nev(p_kar VARCHAR2) RETURN VARCHAR2 IS
...
SELECT nap_nev('2017.05.01'), nap_nev('02.05.2017'),
nap_nev('2017.13.13') FROM dual;
-- -- -- --
-- 15.)
/* Exception, SQLCODE
Írjunk meg egy procedúrát, amelyik a
paraméterében kapott számra
külön
sorokba kiírja annak reciprokát,
négyzetgyökét, és
faktoriálisát.
Ha bármelyik nem
értelmezhető vagy túlcsordulást okoz,
akkor erre
a részre írja ki a kapott hibakódot.
(SQLCODE).
*/
CREATE OR REPLACE PROCEDURE szamok(n number) IS
Tesztelés:
set serveroutput on
execute szamok(0);
execute szamok(-2);
execute szamok(40);
-- -- -- --
-- 16.)
/*
Írjunk meg egy függvényt, amelyik
visszaadja a paraméterként szereplő '+'-szal
elválasztott számok és
kifejezések
összegét. Ha valamelyik kifejezés nem
szám,
akkor azt az összeadásnál hagyja
figyelmen kívül, vagyis 0-nak tekintse.
*/
CREATE OR REPLACE FUNCTION osszeg2(p_char VARCHAR2) RETURN NUMBER IS
...
SELECT osszeg2('1+21 + bubu + y1 + 2 + -1 ++') FROM dual;
Még egy fontos
kiegészítés: Az "Eljut-feladat" PL/SQL-ben
(nincs zh-án)
SQL
WITH RECURSIVE utasítást,
az Eljut
feladatot lásd a 08.gyakorlaton
Adott Járatok tábla
alapján programmal INSERT INTO Eljut (SFW);
Rekurzió: SQL-1999
szabvány
WITH RECURSIVE utasítása helyett itt programmal
> Eljut feladat, gráf
adatszerkezet
lekérdezésére írjunk
programot PL/SQL-ben!
> Ullman-Widom tankönyv
10.2 szakasza Eljut-feladat:
korábbiEA/p67_p80.pdf
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).
-- Ezzel a
scripttel jaratok_tabla.txt
készítsük el a
repülőgépjáratokról a
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)
> 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: Ne
csak a
várospárokat, hanem a teljes
útvonalat is
listázzuk ki.
4.rész: Oracle
PL/SQL kiegészítések
(szorgalmi, nincs a ZH-ban)
PL/SQL
triggerek: 9.
Triggerek
>> Constraints, triggerek
témakör szerepelt Adatbázisok-1
előadáson.
>> PL/SQL
triggerekre példákat lásd Oracle
Példatár
10.fej.Trigger.pdf
PL/SQL
csomagok: 10.
Csomagok
>> Oracle
standard csomagokat lásd Oracle
Database PL/SQL Packages
-- DBMS_OUTPUT
=>> DBMS_OUTPUT.PUT_LINE eljárás
kiírás képernyőre;
-- DBMS_RANDOM
=>> DBMS_RANDOM.VALUE (AlsóHatár,
FelsőHatár) függvény:
a
véletlenszám-generátor
függvény RETURN
binary_integer típusú számot ad.
Ţovábbi
gyakorló
PL/SQL feladatok
>> Oracle
Példatár Feladatok.pdf 10.fejezet trigger-feladatai mellett vegyük elő
a
korábbi 8. fejezet és 9.fejezet
feladatait, és azokat
írjuk át
tárolt eljárásra,
tárolt függvényre, +ahol csak
lehet egészítsük ki
kivétel-
és hibakezeléssel is!