• Nem Talált Eredményt

EXISTS Alakja

In document PL/SQL programozás (Pldal 190-198)

EXISTS(i)

ahol i egy az index típusának megfelelő kifejezés.

Igaz értéket ad, ha az i indexű elem létezik a kollekcióban, egyébként hamisat. Ha nem létező indexre hivatkozunk, az EXISTS hamis értékkel tér vissza és nem vált ki kivételt.

Az EXISTS az egyetlen metódus, amely nem inicializált beágyazott táblára és dinamikus tömbre is meghívható (ekkor hamis értékkel tér vissza), az összes többi metódus ekkor a COLLECTION_IS_NULL kivételt váltja ki.

Az EXISTS használatával elkerülhető, hogy nem létező elemre hivatkozzunk és ezzel kivételt váltsunk ki.

1. példa DECLARE

v_Szerzok T_Szerzok;

i PLS_INTEGER;

BEGIN

SELECT szerzo INTO v_Szerzok FROM konyv WHERE id = 15;

i := 1;

WHILE v_Szerzok.EXISTS(i) LOOP DBMS_OUTPUT.PUT_LINE(v_Szerzok(i));

i := i+1;

END LOOP;

END;

/ /*

Eredmény:

P. Howard Rejtő Jenő

A PL/SQL eljárás sikeresen befejeződött.

*/

2. példa DECLARE

TYPE t_vektor IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;

Kollekciók

v_Vektor t_vektor;

BEGIN

FOR i IN -2..2 LOOP v_Vektor(i*2) := i;

END LOOP;

FOR i IN -5..5 LOOP

IF v_Vektor.EXISTS(i) THEN

DBMS_OUTPUT.PUT_LINE(LPAD(i,2) || ' '

|| LPAD(v_Vektor(i), 2));

END IF;

END LOOP;

END;

/ /*

Eredmény:

-4 -2 -2 -1 0 0 2 1 4 2

A PL/SQL eljárás sikeresen befejeződött.

*/

3. példa DECLARE

TYPE t_tablazat IS TABLE OF NUMBER INDEX BY VARCHAR2(10);

v_Tablazat t_tablazat;

v_Kulcs VARCHAR2(10);

BEGIN

FOR i IN 65..67 LOOP v_Kulcs := CHR(i);

v_Tablazat(v_Kulcs) := i;

END LOOP;

DBMS_OUTPUT.PUT_LINE('Kulcs Elem');

DBMS_OUTPUT.PUT_LINE('--- ----');

Kollekciók

FOR i IN 0..255 LOOP v_Kulcs := CHR(i);

IF v_Tablazat.EXISTS(v_Kulcs) THEN

DBMS_OUTPUT.PUT_LINE(RPAD(v_Kulcs, 7) || v_Tablazat(v_Kulcs));

END IF;

END LOOP;

END;

/ /*

Eredmény:

Kulcs Elem - ----A 65 B 66 C 67

A PL/SQL eljárás sikeresen befejeződött.

*/

COUNT

Paraméter nélküli függvény. Megadja a kollekció aktuális (nem törölt) elemeinek számát. Dinamikus tömb esetén visszatérési értéke azonos a LAST visszatérési értékével, a többi kollekciónál ez nem feltétlenül van így.

1. példa DECLARE

v_Szerzok T_Szerzok;

BEGIN

SELECT szerzo INTO v_Szerzok FROM konyv WHERE id = 15;

FOR i IN 1..v_Szerzok.COUNT LOOP DBMS_OUTPUT.PUT_LINE(v_Szerzok(i));

END LOOP;

END;

/ /*

Eredmény:

P. Howard

Kollekciók

Rejtő Jenő

A PL/SQL eljárás sikeresen befejeződött.

*/

2. példa DECLARE

TYPE t_vektor IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;

v_Vektor t_vektor;

BEGIN

FOR i IN -2..2 LOOP v_Vektor(i*2) := i;

END LOOP;

DBMS_OUTPUT.PUT_LINE(v_Vektor.COUNT);

END;

/ /*

Eredmény:

5

A PL/SQL eljárás sikeresen befejeződött.

*/

LIMIT

Paraméter nélküli függvény. Beágyazott tábla és asszociatív tömb esetén visszatérési értéke NULL. Dinamikus tömb esetén a típusdefinícióban megadott maximális méretet adja.

Példa DECLARE

v_Szerzok T_Szerzok;

v_Konyvek T_Konyvek;

BEGIN

SELECT szerzo INTO v_Szerzok FROM konyv WHERE id = 15;

SELECT konyvek INTO v_Konyvek FROM ugyfel WHERE id = 10;

DBMS_OUTPUT.PUT_LINE('1. szerzo count: ' || v_Szerzok.COUNT

|| ' Limit: ' || NVL(TO_CHAR(v_Szerzok.LIMIT), 'NULL'));

DBMS_OUTPUT.PUT_LINE('2. konyvek count: ' || v_Konyvek.COUNT

|| ' Limit: ' || NVL(TO_CHAR(v_Konyvek.LIMIT), 'NULL'));

END;

/

Kollekciók

/*

Eredmény:

1. szerzo count: 2 Limit: 10 2. konyvek count: 3 Limit: NULL

A PL/SQL eljárás sikeresen befejeződött.

*/

FIRST és LAST

Paraméter nélküli függvények. A FIRST a kollekció legelső (nem törölt) elemének indexét (a kollekció legkisebb indexét), a LAST a legutolsó (nem törölt) elem indexét (a kollekció legnagyobb indexét) adja vissza.

Ha a kollekció üres, akkor értékük NULL. Dinamikus tömbnél a FIRST visszatérési értéke 1, a LAST-é COUNT.

VARCHAR2 típusú kulccsal rendelkező asszociatív tömbnél a legkisebb és legnagyobb kulcsértéket adják meg.

Ha az NLS_COMP inicializációs paraméter értéke ANSI, akkor a kulcsok rendezési sorrendjét az NLS_SORT inicializációs paraméter határozza meg.

1. példa DECLARE

v_Szerzok T_Szerzok;

j PLS_INTEGER;

BEGIN BEGIN

j := v_Szerzok.FIRST;

EXCEPTION

WHEN COLLECTION_IS_NULL THEN

DBMS_OUTPUT.PUT_LINE('Kivétel! ' || SQLERRM);

END;

v_Szerzok := T_Szerzok();

DBMS_OUTPUT.PUT_LINE('first: '

|| NVL(TO_CHAR(v_Szerzok.FIRST), 'NULL')

|| ' last: ' || NVL(TO_CHAR(v_Szerzok.LAST), 'NULL'));

DBMS_OUTPUT.NEW_LINE;

SELECT szerzo INTO v_Szerzok FROM konyv WHERE id = 15;

FOR i IN v_Szerzok.FIRST..v_Szerzok.LAST LOOP DBMS_OUTPUT.PUT_LINE(v_Szerzok(i));

END LOOP;

Kollekciók

END;

/ /*

Eredmény:

Kivétel! ORA-06531: Inicializálatlan gyűjtőre való hivatkozás first: NULL last: NULL

P. Howard Rejtő Jenő

A PL/SQL eljárás sikeresen befejeződött.

*/

2. példa DECLARE

TYPE t_vektor IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;

v_Vektor t_vektor;

BEGIN

FOR i IN -2..2 LOOP v_Vektor(i*2) := i;

END LOOP;

DBMS_OUTPUT.PUT_LINE('first: '

|| NVL(TO_CHAR(v_Vektor.FIRST), 'NULL')

|| ' last: ' || NVL(TO_CHAR(v_Vektor.LAST), 'NULL'));

END;

/ /*

Eredmény:

first: -4 last: 4

A PL/SQL eljárás sikeresen befejeződött.

*/

NEXT és PRIOR Alakjuk:

NEXT(i) PRIOR(i)

ahol i az index típusának megfelelő kifejezés.

A NEXT visszaadja az i indexű elemet követő (nem törölt), a PRIOR a megelőző (nem törölt) elem indexét. Ha ilyen elem nem létezik, értékük NULL.

Kollekciók

VARCHAR2 típusú kulccsal rendelkező asszociatív tömbnél a sztringek rendezettségének megfelelő következő és megelőző kulcsértéket adják meg. Ha az NLS_COMP inicializációs paraméter értéke ANSI, akkor a kulcsok rendezési sorrendjét az NLS_SORT inicializációs paraméter határozza meg.

A FIRST, LAST, NEXT, PRIOR alkalmas arra, hogy bármely kollekció aktuális elemeit növekvő vagy csökkenő indexek szerint feldolgozzuk.

1. példa DECLARE

TYPE t_vektor IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;

v_Vektor t_vektor;

i PLS_ INTEGER;

BEGIN

FOR i IN -2..2 LOOP v_Vektor(i*2) := i;

END LOOP;

i := v_Vektor.FIRST;

WHILE i IS NOT NULL LOOP

DBMS_OUTPUT.PUT_LINE(LPAD(i,2) || ' '

|| LPAD(v_Vektor(i), 2));

i := v_Vektor.NEXT(i);

END LOOP;

DBMS_OUTPUT.NEW_LINE;

i := v_Vektor.LAST;

WHILE i IS NOT NULL LOOP

DBMS_OUTPUT.PUT_LINE(LPAD(i,2) || ' '

|| LPAD(v_Vektor(i), 2));

i := v_Vektor.PRIOR(i);

END LOOP;

END;

/ /*

Eredmény:

-4 -2 -2 -1 0 0 2 1 4 2

Kollekciók

4 2 2 1 0 0 -2 -1 -4 -2

A PL/SQL eljárás sikeresen befejeződött.

*/

2. példa

CREATE OR REPLACE PROCEDURE elofordulasok(p_Szoveg VARCHAR2) IS

c VARCHAR2(1 CHAR);

TYPE t_gyakorisag IS TABLE OF NUMBER INDEX BY c%TYPE;

v_Elofordulasok t_gyakorisag;

BEGIN

FOR i IN 1..LENGTH(p_Szoveg) LOOP

c := LOWER(SUBSTR(p_Szoveg, i, 1));

IF v_Elofordulasok.EXISTS(c) THEN

v_Elofordulasok(c) := v_Elofordulasok(c)+1;

ELSE

v_Elofordulasok(c) := 1;

END IF;

END LOOP;

-- Fordított sorrendhez LAST és PRIOR kellene c := v_Elofordulasok.FIRST;

WHILE c IS NOT NULL LOOP

DBMS_OUTPUT.PUT_LINE(' ''' || c || ''' - '

|| v_Elofordulasok(c));

c := v_Elofordulasok.NEXT(c);

END LOOP;

END elofordulasok;

/

show errors;

ALTER SESSION SET NLS_COMP='ANSI';

Kollekciók

-- Ha az NLS_LANG magyar, akkor az NLS_SORT is magyar rendezést ír most elő -- Egyébként kell még: ALTER SESSION SET NLS_SORT='Hungarian';

EXEC elofordulasok('Babámé');

/*

'a' - 1 'á' - 1 'b' - 2 'é' - 1 'm' - 1

*/

ALTER SESSION SET NLS_COMP='BINARY';

EXEC elofordulasok('Babámé');

/*

'a' - 1 'b' - 2 'm' - 1 'á' - 1 'é' - 1

*/

EXTEND

In document PL/SQL programozás (Pldal 190-198)