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