• Nem Talált Eredményt

fejezet - Kifejezések

In document PL/SQL programozás (Pldal 45-51)

BLOB, CLOB, NCLOB

4. fejezet - Kifejezések

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

Kifejezések

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ő:

a. 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.

b. Összehasonlítjuk rendre a két karakterlánc elemeit, a legelső karaktertől indulva.

c. 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ó.

d. 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ő:

Kifejezések

a. Összehasonlítjuk rendre a két karakterlánc elemeit, a legelső karaktertől indulva.

b. 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ó.

c. Ha elérjük valamelyik karakterlánc végét úgy, hogy a másiknak még nincs vége, akkor az a kisebb.

d. 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:

Kifejezések

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

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.

Kifejezések

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;

/

In document PL/SQL programozás (Pldal 45-51)