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 unárisok (egyoperandusúak) vagy binárisak (kétoperandusúak) lehetnek. A PL/SQL-ben nincs ternáris operátor. A legegyszerűbb kifejezés egyetlen operandusból áll. A PL/SQL a kifejezések infix alakját használja.
A kifejezés kiértékelése az a folyamat, amikor az operandusok értékeit felhasználva az operátorok által meghatározott műveletek egy adott sorrendben végrehajtódnak és előáll egy adott típusú érték. A PL/SQL a procedurális nyelveknél megszokott módon a kiértékelést a balról jobbra szabály alapján a precedenciatáblázat felhasználásával hajtja végre. A PL/SQL precedenciatáblázata a 4.1. táblázatban látható. Itt hívjuk fel a figyelmet, hogy a precedenciatáblázatban nincs kötési irány! A PL/SQL azt mondja, hogy az azonos precedenciájú műveletek végrehajtási sorrendje tetszőleges (ennek következményeit az optimalizáló működésére lásd a 16. fejezetben).
4.1. táblázat - A PL/SQL precedenciatáblázata
Operátor |
**, NOT |
+, – |
*, / |
+, –, || |
=, !=, ~=, ^=, <>, <, >, <=, >=, IS NULL, LIKE, IN, BETWEEN |
AND |
OR |
A kifejezés tetszőlegesen zárójelezhető. A zárójel az operátorok precedenciájának felülbírálására való. A zárójelezett részkifejezést előbb kell kiértékelni, mint az egyéb operandusokat.
Aritmetikai operátorok
Az aritmetikai operátorokkal a szokásos aritmetikai műveletek hajthatók végre, numerikus értékeken.
Operátor |
Jelentése |
** |
hatványozás |
+, – |
unáris előjelek |
* |
szorzás |
/ |
osztás |
+ |
összeadás |
– |
kivonás |
Karakteres operátorok
A PL/SQL-nek egyetlen karakteres operátora van, ez az összefűzés (konkatenáció) operátor: ||. Például:
'A' || 'PL/SQL' || 'alapján'
eredménye
'A PL/SQL alapján'
Ha az összefűzés mindkét operandusa CHAR típusú, az eredmény is az lesz. Ha valamelyik VARCHAR2 típusú, az eredmény is VARCHAR2 típusú lesz.
Hasonlító operátorok
Ezek az operátorok binárisak, két karakteres, numerikus vagy dátum típusú operandust hasonlítanak össze és mindig logikai értéket eredményeznek.
Operátor |
Jelentése |
= |
egyenlő |
!=, ~=, ^=, <> |
nem egyenlő |
< |
kisebb |
> |
nagyobb |
<= |
kisebb egyenlő |
>= |
nagyobb egyenlő |
Két numerikus operandus közül az a kisebb, amelynek az értéke kisebb. Két dátum közül a korábbi a kisebb. A karakteres típusú operandusok összehasonlításánál viszont az Oracle kétféle szemantikát használ, ezek: szóköz-hozzáadásos, nem-szóköz-hozzáadásos.
A szóköz-hozzáadásos szemantika algoritmusa a következő:
Ha a két karakterlánc különböző hosszúságú, akkor a rövidebbet jobbról kiegészítjük annyi szóközzel, hogy azonos hosszúságúak legyenek.
Összehasonlítjuk rendre a két karakterlánc elemeit, a legelső karaktertől indulva.
Ha azonosak, akkor tovább lépünk a következő karakterre. Ha nem azonosak, akkor az a kisebb, amelyiknek az adott karaktere kisebb (természetesen az alkalmazott kódtábla értelmében). Így a hasonlító operátornak megfelelő igaz vagy hamis érték megállapítható.
Ha a karakterláncok végére érünk, akkor azok egyenlők.
Ezen szemantika alapján a következő kifejezések értéke igaz lesz:
'abc' = 'abc'
'xy ' = 'xy'
'xy' < 'xyz'
'xyz' > 'xya'
A nem-szóköz-hozzáadásos szemantika algoritmusa a következő:
Összehasonlítjuk rendre a két karakterlánc elemeit, a legelső karaktertől indulva.
Ha azonosak, akkor továbblépünk a következő karakterre. Ha nem azonosak, akkor az a kisebb, amelyiknek az adott karaktere kisebb (az NLS_COMP és az NLS_SORT inicializációs paraméter beállításától függően). Így a hasonlító operátornak megfelelő igaz vagy hamis érték megállapítható.
Ha elérjük valamelyik karakterlánc végét úgy, hogy a másiknak még nincs vége, akkor az a kisebb.
Ha egyszerre érjük el mindkét karakterlánc végét, akkor azok egyenlők.
Ezen szemantika alapján a fenti kifejezések közül az alábbiak értéke most is igaz:
'abc' = 'abc'
'xy' < 'xyz'
'xyz' > 'xya'
de az
'xy ' = 'xy'
kifejezés értéke hamis.
A PL/SQL a szóköz-hozzáadásos szemantikát akkor használja, ha mindkét operandus fix hosszúságú, azaz CHAR vagy NCHAR típusú, egyébként a nem-szóköz-hozzáadásos algoritmus alapján jár el.
Példa
nev1 VARCHAR2(10) := 'Gábor';
nev2 CHAR(10) := 'Gábor'; -- a PL/SQL szóközöket ad hozzá
A következő IF feltétel hamis, mert nev2 a szóközöket is tartalmazza:
IF nev1 = nev2 THEN …
Ha ezen operátorok valamelyik operandusa NULL értékű, akkor az eredmény értéke is NULL lesz. Ismételten felhívjuk a figyelmet, hogy az üres sztring azonos a NULL értékkel a karakteres típusok esetén.
Ha egy adott értékről azt akarjuk eldönteni, hogy az NULL érték-e, akkor az IS NULL unáris postfix operátort kell használnunk. Ez igaz értéket szolgáltat, ha operandusa NULL, különben pedig hamisat.
A LIKE bináris operátor, amely egy karakterláncot hasonlít egy mintához. A hasonlításnál a kis- és nagybetűk különböznek. Igaz értéket ad, ha a minta illeszkedik a karakterláncra, hamisat, ha nem.
A mintában használhatunk két speciális, helyettesítő karaktert. Az aláhúzás ( _ ) pontosan egy tetszőleges karakterrel helyettesíthető, a százalékjel (%) pedig akármennyivel (akár nulla darabbal is). Az alábbi kifejezések igaz értékűek:
'Almafa' LIKE 'A%a'
'Almafa' LIKE '%'
'Almafa' LIKE '_lm_f_'
A BETWEEN bináris operátor egyesíti a <= és >= operátorok hatását, második operandusa egy intervallumot ad meg
alsó_határ AND felső_határ
formában. Az operátor igaz értéket ad, ha az első operandus értéke eleme az intervallumnak, egyébként pedig hamisat.
A következő kifejezés értéke igaz:
11 BETWEEN 10 AND 20
Az IN bináris operátor második operandusa egy halmaz. Igaz értéket ad, ha az első operandus értéke eleme a halmaznak, egyébként pedig hamisat. A következő kifejezés értéke hamis:
'Piros' IN ('Fekete','Lila')
Logikai operátorok
Operátor |
Jelentése |
NOT |
tagadás |
AND |
logikai és |
OR |
logikai vagy |
A PL/SQL-ben háromértékű logika van (mivel a NULL a logikai típus tartományának is eleme). Az igazságtáblákat a 4.2. táblázat tartalmazza.
4.2. táblázat - Logikai igazságtáblák
NOT |
igaz |
hamis |
NULL |
hamis |
igaz |
NULL |
AND |
igaz |
hamis |
NULL |
igaz |
igaz |
hamis |
NULL |
hamis |
hamis |
hamis |
hamis |
NULL |
NULL |
hamis |
NULL |
OR |
igaz |
hamis |
NULL |
igaz |
igaz |
igaz |
igaz |
hamis |
igaz |
hamis |
NULL |
NULL |
igaz |
NULL |
NULL |
A PL/SQL a logikai operátorokat tartalmazó kifejezések kiértékelését rövidzár módon végzi, azaz csak addig értékeli ki a kifejezést, ameddig annak értéke el nem dől, és a hátralevő részkifejezésekkel nem foglalkozik tovább. Tekintsük a következő kifejezést:
(a=0) OR ((b/a)<5)
A rövidzár kiértékelés annyit jelent, hogy ha a értéke 0, akkor a kifejezés értéke már eldőlt (az OR miatt) és az igaz. Ha viszont nem rövidzár módon történne a kiértékelés, akkor az OR második operandusában nullával való osztás hiba lépne fel.
Feltételes kifejezések
Egy feltételes kifejezés szelektort használ arra, hogy a kifejezés lehetséges értékei közül egyet kiválasszon. Alakja:
CASE szelektor
WHEN kifejezés THEN eredmény
[WHEN kifejezés THEN eredmény]…
[ELSE eredmény]
END
A szelektornak (amely maga is kifejezés) a kifejezés típusával kompatibilis értéket kell szolgáltatnia.
A feltételes kifejezés kiértékelésénél kiértékelődik a szelektor, és az értéke a felsorolás sorrendjében rendre a WHEN utáni kifejezések értékéhez hasonlítódik. Ha van egyezés, akkor a feltételes kifejezés értéke a megfelelő THEN utáni eredmény lesz. Ha egyetlen WHEN utáni kifejezés értékével sincs egyezés és van ELSE ág, akkor az ELSE utáni eredmény lesz a feltételes kifejezés értéke. Ha pedig nincs ELSE, akkor NULL.
1. példa
DECLARE
v_Osztalyzat NUMBER(1);
v_Minosites VARCHAR2(10);
BEGIN
.
.
.
v_Minosites :=
CASE v_Osztalyzat
WHEN 5 THEN 'Jeles'
WHEN 4 THEN 'Jó'
WHEN 3 THEN 'Közepes'
WHEN 2 THEN 'Elégséges'
WHEN 1 THEN 'Elégtelen'
ELSE 'Nincs ilyen osztályzat'
END;
.
.
.
END;
/
A feltételes kifejezésnek létezik olyan alakja, ahol nincs szelektor és a WHEN után feltételek (logikai kifejezések) állnak. Ekkor az első olyan WHEN ág eredménye lesz a feltételes kifejezés értéke, amelyben a feltétel igaz. Az ELSE az előzőhöz hasonlóan működik.
2. példa
DECLARE
v_Osztalyzat NUMBER(1);
v_Minosites VARCHAR2(10);
BEGIN
.
.
.
v_Minosites :=
CASE
WHEN v_Osztalyzat = 5 THEN 'Jeles'
WHEN v_Osztalyzat = 4 THEN 'Jó'
WHEN v_Osztalyzat = 3 THEN 'Közepes'
WHEN v_Osztalyzat = 2 THEN 'Elégséges'
WHEN v_Osztalyzat = 1 THEN 'Elégtelen'
ELSE 'Nincs ilyen osztályzat'
END;
.
.
.
END;
/