A legegyszerűbb művelet az értékadás művelete. Az értékadás bal oldalán változónak kell állnia, jobb oldalán pedig változókból, konstansokból és beépített függvényekből álló kifejezés szerepel. Az alábbi példában az x változó értékét eggyel megnöveljük:
Illetve a másik lehetőség:
Az utóbbival nem lehet logikai változónak értéket adni.
Az üres utasítás létezik! Formája:
A kifejezés operátorokból és operandusokból áll. Az operandus lehet literál, nevesített konstans, változó és függvényhívás. Az operátorok lehetnek egyoperandusúak vagy kétoperandusúak.
A kifejezés kiértékelése azt jelenti, hogy az operandusok értékeit felhasználva, az operátorok által meghatározott műveletek adott sorrendben végrehajtódnak, és egy adott típusú értéket kapunk eredményül.
A kifejezések tetszőlegesen zárójelezhetők. A zárójel az operátorok precedenciáját határozza meg
Az operátorok csoportosítása:
Aritmetikai operátorok
Karakteres operátorok
PL/SQL-ben egy karakteres operátor létezik, mégpedig a konkatenáció. Operátora: ||
Példa:
Hasonlító operátorok
Logikai operátorok
A logikai operátorokat tartalmazó kifejezéseket a PL/SQL lusta módon értékeli ki. Azaz, csak addig értékeli ki a kifejezést, amíg értéke el nem dől.
A PL/SQL 10-es verziójának egyik legjelentősebb újítása, hogy a reguláris kifejezések használatának támogatása. A REGEXP_INSTR, REGEXP_REPLACE, és REGEXP_SUBSTR beépített függvények a string kezeléshez nyújtanak segítséget, míg a REGEXP_LIKE SQL operátor, a reguláris kifejezések mintakeresésben való felhasználását segíti. A következő táblázat összefoglalja az Oracle által használt jelöléseket.
REGEXP_LIKE: Karakterlánc és minta összehasonlítására alkalmas. Működése hasonló a LIKE feltételéhez, viszont azzal ellentétben nem csak egyszerű mintákat, hanem bonyolultabb reguláris kifejezéseket is megadhatunk.
Operátor |
Leírás |
\ a |
A backslash karakternek négy
különböző jelentése lehet: ·
Önmagát jelenti A következő karakterre vonatkozik ·
Egy operátort vezet be ·
Nincs szerepe |
* |
Nulla vagy több előfordulás |
+ |
Egy vagy több előfordulás |
? |
Nulla vagy egy előfordulás |
| |
Választás operator alternatív minták megadásához |
^ b |
Illeszkedés a minta elején |
$ b |
Illeszkedés a minta végén |
. c |
Bármilyen karaketer a támogatott
karakterkészletből, kivéve a NULL |
[ ] d |
A zárójelek között felsorolt kifejezések bármelyikére való
illeszkedés. A ^ karakternek speciális jelentése van, a nem illeszkedést
jelenti. |
( ) |
Csoportképző operátor, amelyben szereplő kifejezésre
később \n alakban hivatkozhatunk, ahol n a teljes reguláris kifejezésben részkifejezés
sorszáma. |
{m} |
Pontosan m-szeres ismétlődés. |
{m,} |
Legalább m-szeres ismétlődés. |
{m,n} |
Legalább m, de legfeljebb n-szeres
ismétlődés. |
\ne |
Hivatkozás az n-edik ’(’ ’)’
zárójelek közé zárt kifejezésre Az n 1 és 9 között lehet. |
[..] f |
Karakterek egy csoportja vagy egy több karakterből álló
szimbólum pl.: ’ny’, ’ly’
|
[: :] g |
Karakterosztály megadása (pl.: [:alpha]). A karakterosztályon belül bármely
karakterre illeszkedik |
[==] h |
Ekvivalens osztályok meghatározása. |
Karakterosztályok
Karakterosztály |
Jelentés |
[:alnum:] |
Minden alfanumerikus karakter |
[:alpha:] |
Minden betű karakter |
[:blank:] |
Minden fehérelválasztó. |
[:cntrl:] |
Minden kontroll karakter (nem nyomtatható) |
[:digit:] |
Minden numerikus szám |
[:graph:] |
[:punct:],[:upper:],[:lower:],
és [:digit:]
karakterek. |
[:lower:] |
Minden kisbetű. |
[:print:] |
Nyomtatható karakterek. |
[:punct:] |
Írásjelek. |
[:space:] |
Minden helyköz karakter (nem nyomtatható). |
[:upper:] |
Minden nagybetű. |
[:xdigit:] |
Minden érvényes 16-os számrendszerbeli szám. |
Az egymás után végrehajtandó utasítások sorozatát pontosvesszővel kell elválasztani.
A PL/SQL blokk a következő utasításokat tartalmazhatja:
:= |
értékadás |
CLOSE |
kurzor lezárása (SQL utasítás) |
COMMIT |
tranzakció sikeres lezárása (SQL utasítás) |
DELETE |
adatok törlése az adatbázisban (SQL utasítás) |
EXIT |
kilépés a ciklusból |
FETCH |
rekord beolvasás a kurzorból (SQL utasítás) |
GOTO |
ugrás a megadott címkére |
IF |
feltételes elágazás |
INSERT |
adatok beszúrása az adatbázisba (SQL utasítás) |
LOCK TABLE |
táblák zárolása(SQL utasítás) |
LOOP |
ciklus szervező utasítás |
NULL |
üres utasítás |
OPEN |
kurzor nyitása (SQL utasítás) |
RAISE |
hibajelenség kiváltása |
ROLLBACK |
tranzakció visszagörgetése(SQL utasítás) |
SAVEPOINT |
tranzakció mentési pont(SQL utasítás) |
SELECT..INTO |
lekérdezés az adatbázisból(SQL utasítás) |
SET TRANSACTION |
tranzakció paraméterzés(SQL utasítás) |
UPDATE |
adatok módosítása az adatbázisban(SQL utasítás) |
Az egyes műveletek végrehajtását számtalan segédfüggvény segíti, melyekkel többek között numerikus, karakterkezelési, dátumkezelési és konverziós műveletek végezhetők. Az utasítások felsorolásából is látszik, hogy a PL/SQL a külvilág felé zárt, csak az adatbázisban tárolt adatokhoz fér hozzá. Adatértékeket, mint például a változók tartalmát nem lehet vele a képernyőre, normál állományba kiírni, vagy a képernyőről, normál állományból beolvasni. A SELECT eredményeit a blokk változóiban kell felfogni. Természetesen ezen értékek nem vesznek el örökre előlünk, a kapcsolatot a PL/SQL blokk és a külvilág között a kapcsolódó segédprogramok, mint például a SQLForms vagy az SQLPlus biztosítja.
Elágazást az IF-THEN-ELSE szerkezetekkel tudunk megvalósítani. Három formája van: IF-THEN, IF-THEN-ELSE, IF-THEN-ELSIF.
IF-THENA feltétel teljesülése esetén a törzsben szereplő utasítások végrehajtódnak.
IF-THEN-ELSEHa a feltétel hamis, akkor az ELSE ág hajtódik végre.
IF-THEN-ELSEIFHa feltétel1 hamis, akkor feltetel2 is kiértékelődik és ennek megfelelően hajtódnak végre az utasítások2 vagy az utasítások3.
Példa:
A feltétel részben a hagyományos operátorok, relációk mellett alkalmazhatók az SQL-ben megismert speciális operátorok is, mint az
IS [NOT] NULL üres érték ellenőrzése
[NOT] LIKE szövegkeresés minta alapján
[NOT] BETWEEN értéktartományba esés
[NOT] IN halmazban való előfordulás operátorok.
A CASE utasítás
A PL/SQL 9-es verziójától kezdve használhatjuk a CASE utasítást, hogy több ágú elágazást írjunk. Két lehetőség közül választhatunk. Vagy a
formát választjuk, vagy a
alakot.
Az első esetben a when ágak kifejezései szekvenciális sorrendben összehasonlításra kerülnek a szelektorral. Az első olyan ág fog végrehajtódni, ahol a két érték megegyezik.
A második esetben a when ágak feltételei szintén szekvenciális sorrendben értékelődnek ki és azon utasítás fog végrehajtódni, amelyhez tartozó feltétel teljesül (vagyis „igaz” értékkel értékelődik ki).
Az utasítás lehet blokkutasítás is, így az egyes ágakhoz bonyolultabb utasítássorozat is hozzárendelhető.
Ha a kiértékelés után egyetlen when ág sem hajtódik végre, akkor az else ág hajtódik végre. Amennyiben létezik.
Ha nincs else ág, akkor a végrehajtás az elágazást követő első utasítással folytatódik.
Ez utóbbi történik abban az estben is, ha a szelektor értéke NULL.
Három fajta ciklust találhatunk: LOOP, WHILE-LOOP, FOR-LOOP
LOOP
Végtelen ciklus, az utasítások egymás után hajtódnak végre. Ha meg akarjuk szakítani a ciklus futását, akkor azt az EXIT vagy EXIT-WHEN szerkezetekkel tehetjük meg. Az EXIT azonnal kilép a ciklusból, az EXIT-WHEN pedig egy feltétel teljesüléséhez köti a kilépést.
Példa:
WHILE-LOOP
Mindaddig, amíg a feltétel teljesül, a ciklus törzsében szereplő utasítások sorozatosan végrehajtódnak.
Példa:
FOR-LOOP
A ciklus mindaddig végrehajtódik, míg a számláló az alsó- és felső korlát között található. Minden egyes végrehajtás után a számláló eggyel növekszik (vagy csökken, ha a REVERSE meg van adva). A ciklusban megadott indexváltozót nem szükséges külön deklarálni a deklarációs részben, mivel a rendszer automatikusan létrehozza NUMBER típusúként. A ciklus fejrészében megadott index csak a cikluson belül látható és úgy kezelhető, mint egy konstans: használhatjuk az aktuális értékét, de közvetlenül nem változtathatjuk meg.
Példa:
A for ciklust kurzorokkal összevonva is használhatjuk, így végig tudunk iterálni a kurzor által ismert rekordokon. Az alábbi kódban látható egy egyszerű példa, amely végig megy a rekordokon és kiírja azok azonosítóját.
Ugró utasítás – GOTO; címke
A nagyobb méretű, kevésbé szabályos vezérlésátadások megvalósítására
rendelkezésre áll a GOTO utasítás, melynek formátuma:
A cimkét a blokkban, a műveleti részben helyezhetjük el. A cimke azonosítót
nem kell előzőleg definiálni. A címke kijelölésének alakja:
A címke használatára, a vezérlésátadásra viszonylag több megkötés is
vonatkozik. Elsőként meg kell említeni, hogy címke csak végrehajtható
utasítások előtt állhat, tehát nem szerepelhet END IF, END LOOP, END
kulcsszavak előtt. E megkötés szerencsére igen könnyen kikerülhető, ha a
kívánt helyre beszúrunk egy üres utasítást (NULL utasítást), amely formailag
végrehajtató utasítás, habár semmi nem történik eredményeképpen.
Így például az alábbi programrészlet szintaktikailag helytelen, mivel a cimke
END LOOP előtt áll:
A kijavított változatban az END LOOP elé egy üres utasítást teszünk:
További megkötés, hogy a GOTO paranccsal nem ugorhatunk tetszőleges cimkére, csak olyanra, amely az adott utasításcsoportban, vagy az őt tartalmazó külső utasításcsoportok valamelyikében helyezkedik el. Utasításcsoport alatt nemcsak PL/SQL blokkokat, hanem egy vezérlési utasítással (IF, LOOP) összekötött utasításokat értünk. Igy például az alábbi blokkban helytelen a vezérlésátadás művelete:
A hiba oka, hogy egy tartalmazott utasításcsoportba kell belépni, amit nem enged meg a PL/SQL. Ha egymással felcseréljük az ugrás és a címke pozícióját, akkor viszont helyes elrendezést kapunk, mivel az ugrás a külső, a GOTO utasítást tartalmazó csoportba történik. Az alábbi példa egy helyes blokkrészletet mutat.
A hibakezelő részben is szerepelhet GOTO utasítás és címke is. Azonban itt
olyan megkötés áll fenn, hogy kintről, a műveleti részből nem lehet beugrani a
hibakezelő részbe, s a hibakezelő részből sem átlépni a saját PL/SQL blokk
műveleti részébe.
A címkék nemcsak végrehajtható utasítások előtt állhatnak, hanem blokkok
előtt is, azaz a bevezető DECLARE vagy BEGIN kulcsszavak előtt. E címkék
szerepe elsősorban nem a vezérlés átadó ugrásoknál van, hanem a változók
elérésénél. Mint már korábban említettük, egy adott blokkban deklarált változó
elrejti a külső blokkban ugyanolyan néven létrehozott változókat. A címke
használatával lehetőség van azonban arra, hogy blokkra explicite hivatkozzunk,
így közvetlenül hivatkozhatunk a benne létrehozott változókra is a
formátumban. Erre mutat egy példát a következő kódrészlet: