11.GYAKORLAT (ADATBÁZISOK)
- Ismétlés: A deklaratív
SQL
halmazszemlélete és a procedurális
PL/SQL
progr.szemlélete
közötti különbség
áthidalására két
technikát tanultunk:
>> 9.gyak.
Változóhasználat (felhasználói, külső, belső) Példatár 8.fej.pdf
>> 10.gyak. Kurzorok (implicit, explicit kurzorok) Oracle
Példatár 9.fej.pdf
Témakör: PL/SQL--3: FOR UPDATE kurzor, kivételkezelés, alprogramok
>> I.RÉSZ
- Módosítható kurzor: FOR UPDATE záradék, CURRENT OF kurzor
>> II.RÉSZ
-
Kivétel- és hibakezelés, Alprogramok,
Példatár 10.fej.PSM.pdf
>> III.RÉSZ
- Triggerek, lásd Tankönyv, Előadás, Példatár
10.fej.Trigger.pdf
>> IV.RÉSZ
- PL/SQL gyakorló feladatsor +Példatár
Feladatok.pdf/9-10.fej.
-
Oracle PL/SQL doksi: Oracle
Database 12.2 - PL/SQL
Language Reference
Ez az egyetlen megengedett
segédlet, amit a ZH írás
alatt
is használhatunk
.pdf-ben: https://docs.oracle.com/../database-pl-sql-language-reference.pdf
>> a
doksiból nézünk példákat:
List
of Examples (PL/SQL Lang.Ref.12.2)
>> 11.gyakorlaton 8.fej.
Alprogramok, 9.fej. Triggerek, 11.fej. Kivételkezelés.
I.RÉSZ - Módosítható kurzor: FOR UPDATE >> 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]
II.RÉSZ - PL/SQL
kivétel- és
hibakezelés >> 11.fej.
PL/SQL Kivételek
>>
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')
[volt progr.alapok] PL/SQL alprogramok >> 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
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
[kieg. nincs a zh-án] 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.
III.RÉSZ - Triggerek >> 9.
Triggerek [gyak.zh-án nincs, csak EA/vizsgán]
>> Constraints, triggerek
témakör szerepelt Adatbázisok-1
előadáson
Ullman-Widom: Adatbázisrendszerek. Alapvetés Tankönyv 7.5, 8.2.
>> PL/SQL
triggerekre példákat lásd Oracle
Példatár
10.fej.Trigger.pdf
IV.RÉSZ
- PL/SQL GYAKORLÓ 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;
Ţ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!