Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
1
PL/SQL alapok Adatbázis-kezelés
2
Jelölések Az SQL, PL/SQL utasítások, nevek stb. (terminálisok) nagybetűvel szerepelnek, pl.: SELECT. A nemterminálisok kisbetűvel, pl.: eredmeny. Az alternatívákat függőleges vonal választja el egymástól ( | ). Az opcionális elemek szögletes zárójelben állnak ( [ ] ), pl.: [NOT NULL]. A kötelezően megadandó alternatívákat kapcsos zárójelek fogják közre ( { } ), pl.: {kifejezes | feltetel}. Az iteráció jelölésére három pont szolgál (...), pl.: utasitas [utasitas]...
3
A példákhoz használt adatbázis
automata (azon, penz, reszl_azon, varos) ugyfel (azon, nev, szuletes, keret) szamla (azon, ugyf_azon, reszl_azon, osszeg, lejarat) reszleg (azon, varos, tartalek) tranzakcio (azon, aut_azon, szaml_azon, ugyf_azon, datum, osszeg) Itt az automata tábla reszl_azon attribútuma azt adja meg, hogy melyik bank részleghez tartozik az adott automata, a penz pedig az automatán rendelkezésre álló pénzösszeget tárolja. A tranzakcio tábla osszeg attribútumának egy-egy értéke, ha negatív előjelű, pénzlevételt, ha pozitív, számlafeltöltést jelöl. A példa adatbázisban a Zseton Bank részlegeiről van szó.
4
Blokk A PL/SQL alapvető programegysége a blokk. Bárhol megjelenhet, ahol végrehajtható utasítás állhat. Felépítése: [DECLARE deklaraciok] BEGIN utasitas [utasitas]... [EXCEPTION kivetelkezelo] END; Megjegyzés: A címkék és GOTO utasítás használatához lásd Oracle dokumentáció.
5
Összetett típus, rekord
Az összetett típust mindig felhasználói adattípusként kell létrehozni. A rekord heterogén összetett típus, ezzel szemben az index alapú tábla, beágyazott tábla, dinamikus tömb minden eleme azonos típusú. Rekord szintaxisa: TYPE nev IS RECORD ( mezonev tipus [[NOT NULL] {:= | DEFAULT} kifejezes] [, mezonev tipus [[NOT NULL] {:= | DEFAULT} kifejezes]]…); A mezonev a rekord mezőinek neve. A típus REF CURSOR kivételével bármi lehet. Ha egy NOT NULL mező NULL értéket kap VALUE_ERROR kivétel váltódik ki.
6
Példa rekordra Példa: DECLARE TYPE film IS RECORD (
cim VARCHAR2(20) NOT NULL, datum DATE DEFAULT SYSDATE, hossz NUMBER, studio VARCHAR2(15));
7
%TYPE, %ROWTYPE %TYPE: egy korábban már deklarált kurzorváltozó, mező, rekord, adatbázistábla oszlop vagy változó típusát veszi át és ezzel a típussal deklarálja a változót. Tábla oszlopának típusa is definiálható így egy korábban megadott táblát használva. %ROWTYPE: olyan rekordtípust szolgáltat, amely egy adatbázistábla sort vagy kurzor által kezelt sort reprezentál. Mindkét esetben, ha a hivatkozott objektumban változás lép fel, ezt a %TYPE, %ROWTYPE segítségével deklarált változó is követi.
8
%TYPE, %ROWTYPE példa CREATE TABLE pelda AS ( nev VARCHAR2(20),
id CHAR(3) NOT NULL); DECLARE sor pelda%ROWTYPE, valtozo pelda.id%TYPE, …
9
Feltételes kifejezés A legtöbb kifejezés az SQL tárgyalásánál szerepelt. Feltételes kifejezés alakja: CASE szelektor WHEN kifejezes THEN eredmeny [WHEN kifejezes THEN eredmeny]... [ELSE eredmeny] END
10
Példa feltételes kifejezésre
DECLARE datum DATE := DATE ' '; evszak VARCHAR2(6); BEGIN evszak := CASE WHEN TO_CHAR(datum, 'MM') IN ('01', '02', '12') THEN 'tel' WHEN TO_CHAR(datum, 'MM') IN ('03', '04', '05') THEN 'tavasz' WHEN TO_CHAR(datum, 'MM') IN ('06', '07', '08') THEN 'nyar' WHEN TO_CHAR(datum, 'MM') IN ('09', '10', '11') THEN 'osz' ELSE 'Hiba' END; DBMS_OUTPUT.PUT_LINE (evszak); END;
11
Üres utasítás, feltételes utasítás
Üres utasítás használható általában mindenütt, ahol végrehajtható utasítás állhat. Alkalmazásakor a vezérlés a következő utasításra kerül. Használható pl. rekurzív függvények „zárásaként”. Alakja: NULL; Feltételes utasítás alakja: IF feltetel THEN utasitas [utasitas].... [ELSIF feltetel THEN utasitas [utasitas]....]... [ELSE utasitas [utasitas]....] END IF;
12
Példa feltételes utasításra
DECLARE szam NUMBER := -5; absz NUMBER; BEGIN IF szam >= 0 THEN absz := szam; ELSE absz:= -1 * szam; END IF; DBMS_OUTPUT.PUT_LINE (szam || ' abszolút értéke: '|| absz); END;
13
CASE utasítás A CASE utasítás alakja: CASE [szelektor_kifejezes]
WHEN {kifejezes | feltetel} THEN utasitas [utasitas]... [WHEN {kifejezes | feltetel} THEN utasitas [utasitas]...]... [ELSE utasitas [utasitas]...] END CASE;
14
Példa CASE utasításra DECLARE osztalyzat NUMBER(1) := 4; BEGIN CASE osztalyzat WHEN 1 THEN DBMS_OUTPUT.PUT_LINE('elégtelen'); WHEN 2 THEN DBMS_OUTPUT.PUT_LINE('elégséges'); WHEN 3 THEN DBMS_OUTPUT.PUT_LINE('közepes'); WHEN 4 THEN DBMS_OUTPUT.PUT_LINE('jó'); WHEN 5 THEN DBMS_OUTPUT.PUT_LINE('jeles'); ELSE DBMS_OUTPUT.PUT_LINE('Nincs ilyen jegy.'); END CASE; END;
15
Alapciklus Alakja: LOOP utasitas [utasitas]... END LOOP; Példa:
DECLARE fakt NUMBER:=1; i PLS_INTEGER:=2; BEGIN LOOP fakt:=fakt*i; EXIT WHEN fakt > 1000; i:=i+1; END LOOP; DBMS_OUTPUT.PUT_LINE('A faktorialis: ' || fakt); END;
16
WHILE ciklus Alakja: WHILE feltétel LOOP utasitas [utasitas]...
END LOOP; Példa: DECLARE ossz NUMBER :=1; BEGIN WHILE ossz < 10000 LOOP ossz := 2*ossz; END LOOP; DBMS_OUTPUT.PUT_LINE (ossz); END;
17
FOR ciklus Alakja: FOR ciklusvaltozo IN [REVERSE] also_hatar..felso_hatar LOOP utasitas [utasitas]... END LOOP; A ciklusvaltozo PLS_INTEGER típusú változó lesz, hatásköre a ciklusmag. Rendre felveszi az also_hatar, felso_hatar egészértékű kifejezések által definiált tartomány minden értékét. Az EXIT utasítással itt is bármikor kiléphetünk a ciklusból.
18
Példa FOR ciklusra DECLARE ossz NUMBER := 0;
BEGIN FOR i in 1..100 LOOP ossz := ossz + i; END LOOP; DBMS_OUTPUT.PUT_LINE('Az első száz szám összege: ' || ossz); END;
19
A SELECT INTO utasítás I.
Példa I.: DECLARE reszl_varos reszleg.varos%TYPE; BEGIN SELECT varos INTO reszl_varos FROM reszleg WHERE azon = 'B01'; DBMS_OUTPUT.PUT_LINE('A varos: ' || reszl_varos); END;
20
A SELECT INTO utasítás II.
Példa II.: DECLARE sor reszleg%ROWTYPE; BEGIN SELECT * INTO sor FROM reszleg WHERE azon = 'B01'; END; A SELECT, FROM záradékok ugyanúgy viselkednek, mint a „normális” SQL lekérdezések esetében. Gondoskodni kell, hogy a lekérdezés végeredménye megfeleljen az INTO záradékban megadott változó, rekord típusának. A lekérdezés nem adhat vissza több sort végeredményként ebben az esetben.
21
Tranzakció A logikailag egybetartozó utasításokat általában egy munkamenetként kezelik. Az utasításoknak vagy mindegyike végrehajtódik vagy egyik sem. Az ilyen munkameneteket tranzakciónak nevezzük. Egy-egy adatbáziskezelő általában több párhuzamos tranzakciót kezel egyszerre. Nemzetközi példák: helyfoglalás egy-egy repülőgép járatra, bankjegyautomaták. Kívánalmak. Atomosság: egy tranzakció vagy teljes egészében végrehajtódik vagy egyik része sem hajtódik végre; Konzisztencia: minden adatbázisban adottak bizonyos konzisztencia-feltételek. Pl. egy járat ugyanazon helyét nem foglalhatja le ugyanaz a két utas. A tranzakciók befejeződése után az adatbázisnak konzisztensnek kell lennie. Elkülönítés: a tranzakciók konkurencia-vezérlését úgy kell megoldani, mintha a tranzakciók egymás után futnának. Tartósság: ha egy tranzakció befejezte működését, annak eredménye nem veszhet el azonnali rendszerhiba esetén sem.
22
Zárak, visszagörgetés A zár átmeneti tulajdonosi jogkört biztosít egy felhasználónak egy-egy adatbázisbeli objektum: pl. tábla, tábla bizonyos sorai fölött. Más felhasználó nem módosíthatja az adatokat mindaddig, amíg a zárolás fennáll. Ha F1 felhasználó egy táblát éppen lekérdez, F2 ugyanazt módosítja, akkor az Oracle egy nézetet hoz létre F1 számára, F2 módosításai pedig a tábla egy pillanatfelvételén történnek meg. Az Oracle egy visszagörgető szegmenst használ a módosítások tárolására és az olvasási konzisztencia biztosítására. Sikeres végrehajtás esetén a visszagörgető szegmens információi átkerülnek az adatbázisba, véglegesítődnek. Ha hiba történik, a tranzakció „visszagörgetődik”, az adatbázis tranzakció előtti állapota nem változik meg.
23
COMMIT, SAVEPOINT, ROLLBACK
Tranzakció véglegesítése: COMMIT [WORK] Megjegyzés: a WORK alapszó csak a jobb olvashatóságot biztosíthatja. A mentési pontok egy tranzakció részleges visszagörgetését szolgálhatják: SAVEPOINT nev; Visszagörgetés: ROLLBACK [WORK] [TO [SAVEPOINT] mentesi_pont]; Az egyszerű ROLLBACK érvényteleníti a teljes tranzakció hatását, oldja a zárakat, törli a mentési pontokat. A TO utasítással rendelkező ROLLBACK a megadott mentési pontig görgeti vissza a tranzakciót. A mentési pont után a zárak feloldásra kerülnek, a tranzakció a mentési ponttól folytatódik. Megjegyzés: az INSERT, DELETE, UPDATE utasítások előtt az Oracle egy implicit mentési pontot helyez. Ha az utasítás sikertelen, visszagörgetés történik. Kezeletlen kivétel esetén a gazdakörnyezet dönt. Emiatt érdemes explicit módon elhelyezni a fenti utasításokat.
24
Feladatok Írassuk ki a „Szeretlek világ!” üzenetet.
Írassuk ki Kismiska születési dátumát. Írassuk ki Malvinka azonosítóját és születési dátumát. Írassuk ki, hogy hány tranzakció történt április 27-én. Írassuk ki a legkisebb, nél nagyobb, 7-tel osztható számot. Írassuk ki a 100-nál kisebb prímszámokat.
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.