Összetett típusok
Összetett típusok Rekordtípus Rekordtípus deklarációja: TYPE név IS RECORD ( mezőnév típus [[NOT NULL] {:= DEFAULT} kifejezés] [, mezőnév típus [[NOT NULL] {:= DEFAULT} kifejezés]] ); Rekord deklarációja: rekordnév rekordtípusnév; Például: TYPE t_alk_rec IS RECORD ( nev VARCHAR2(46), fizetes NUMBER(8,2), email VARCHAR2(25) NOT NULL); v_fonok t_alk_rec;
Összetett típusok Kollekciók PLSQL kollekciótípusai: asszociatív tömb beágyazott tábla dinamikus tömb 3GL nyelvek tömb fogalmának felelnek meg egydimenziós, indexe minden esetben lehet egész (asszociatív tömb esetén sztring is) Létrehozása két lépcsőben történik: kollekciótípus létrehozása kollekcióváltozó deklarálása (kollekciónév kollekciótípus_név;) Elemeinek típusa REF CURSOR kivételével tetszőleges PLSQL típus Egy elemére kollekciónév(index) módon hivatkozhatunk
Metódus Visszatérési típus EXISTS BOOLEAN Kollekciómetódusok Tevékenység Igaz értéket ad, ha az adott indexű elem létezik a kollekcióban COUNT NUMBER Visszaadja a kollekció elemeinek számát LIMIT NUMBER Visszaadja a kollekció maximális méretét FIRST indextípus Visszaadja a kollekció első elemének indexét LAST indextípus Visszaadja a kollekció utolsó elemének indexét NEXT PRIOR indextípus indextípus EXTEND nincs Bővíti a kollekciót Visszaadja egy megadott indexű elemet követő elem indexét Visszaadja egy megadott indexű elemet megelőző elem indexét TRIM nincs Eltávolítja a kollekció utolsó elemeit DELETE nincs A megadott elemeket törli a kollekcióból
Kollekciók Asszociatív tömb TYPE név IS TABLE OF elemtípus [NOT NULL] INDEX BY indextípus; Kulcs-érték párok halmaza (hashtábla) Csak PLSQL programokban használható Az indextípus PLS_INTEGER, BINARY_INTEGER, VARCHAR2(n), STRING(n) (vagy LONG) lehet. Az indexeknek nincs (elvi) határa Az i indexű elemnek történő értékadás létrehozza az adott elemet, ha nem létezett, és felülírja az értékét, ha létezett
Asszociatív tömb - kollekciómetódusok EXISTS(i) COUNT LIMIT FIRST LAST NEXT(i) PRIOR(i) DELETE, DELETE(i), DELETE(i,j)
TYPE t_kolcsonzesek_at_binint IS TABLE OF kolcsonzes%rowtype INDEX BY BINARY_INTEGER; TYPE t_kolcsonzesek_at_plsint IS TABLE OF kolcsonzes%rowtype INDEX BY PLS_INTEGER; TYPE t_konyv_idk_at_vc2 IS TABLE OF konyv.id%type INDEX BY konyv.isbn%type; -- VARCHAR2(30) TYPE t_vektor IS TABLE OF NUMBER INDEX BY BINARY_INTEGER; TYPE t_matrix IS TABLE OF t_vektor INDEX BY BINARY_INTEGER; TYPE t_at_orszagok IS TABLE OF orszagok%rowtype INDEX BY VARCHAR2(100);
TYPE t_vektor IS TABLE OF NUMBER INDEX BY BINARY_INTEGER; v_vektor t_vektor; 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(i ' ' v_vektor(i)); END IF; END LOOP;
TYPE t_tablazat IS TABLE OF NUMBER INDEX BY VARCHAR2(10); v_tablazat t_tablazat; v_kulcs VARCHAR2(10); 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('----- ----'); FOR i IN 0..255 LOOP v_kulcs := CHR(i); IF v_tablazat.exists(v_kulcs) THEN DBMS_OUTPUT.PUT_LINE(v_Kulcs v_tablazat(v_kulcs)); END IF; END LOOP;
TYPE t_vektor IS TABLE OF NUMBER INDEX BY BINARY_INTEGER; v_vektor t_vektor; FOR i IN -2..2 LOOP v_vektor(i*2) := i; END LOOP; DBMS_OUTPUT.PUT_LINE('1. count: ' v_vektor.count); -- Hány tényleges elem esik ebbe az intervallumba? v_vektor.delete(-1, 2); DBMS_OUTPUT.PUT_LINE('2. count: ' v_vektor.count);
TYPE t_tablazat IS TABLE OF NUMBER INDEX BY VARCHAR2(10); v_tablazat t_tablazat; v_tablazat('a') := 1; v_tablazat('a') := 2; v_tablazat('z') := 3; v_tablazat('z') := 4; DBMS_OUTPUT.PUT_LINE('1. count: ' v_tablazat.count); v_tablazat.delete('a','z'); DBMS_OUTPUT.PUT_LINE('2. count: ' v_tablazat.count);
TYPE t_vektor IS TABLE OF NUMBER INDEX BY BINARY_INTEGER; v_vektor t_vektor; 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'));
TYPE t_vektor IS TABLE OF NUMBER INDEX BY BINARY_INTEGER; v_vektor t_vektor; i PLS_INTEGER; 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(i ' ' v_vektor(i)); i := v_vektor.next(i); END LOOP; i := v_vektor.last; WHILE i IS NOT NULL LOOP DBMS_OUTPUT.PUT_LINE(i ' ' v_vektor(i)); i := v_vektor.prior(i); END LOOP;
TYPE NickList IS TABLE OF VARCHAR2(64) INDEX BY VARCHAR2(32); nicknames NickList; nicknames('bob') := 'Robert'; nicknames('buffy') := 'Esmerelda'; nicknames('chip') := 'Charles'; nicknames('dan') := 'Daniel'; nicknames('fluffy') := 'Ernestina'; nicknames('rob') := 'Robert'; -- following deletes element denoted by this key nicknames.delete('chip'); -- following deletes elements with keys in this --alphabetic range nicknames.delete('buffy','fluffy');
TYPE sum_multiples IS TABLE OF PLS_INTEGER INDEX BY PLS_INTEGER; n PLS_INTEGER := 5; sn PLS_INTEGER := 10; m PLS_INTEGER := 3; FUNCTION get_sum_multiples (multiple IN PLS_INTEGER, num IN PLS_INTEGER) RETURN sum_multiples IS s sum_multiples; FOR i IN 1..num LOOP s(i) := multiple * ((i * (i + 1)) 2); END LOOP; RETURN s; END get_sum_multiples; DBMS_OUTPUT.PUT_LINE ('Sum of the first ' n ' multiples of ' m ' is ' get_sum_multiples (m, sn)(n));
Kollekciók Dinamikus tömb TYPE név IS {VARRAY VARYING ARRAY} (max_méret) OF elemtípus [NOT NULL]; deklarációjakor meg kell adni a max. méretet Az elemek folytonosan helyezkednek el Az indexelés 1-től indul 0 és max_méret közötti elemszámmal rendelkezhet (max. 2 31 ) Speciális objektumtípus Az ilyen típusú változó tulajdonképpen egy referencia automatikus kezdőértékadás (NULL) explicit kezdőértékadás (példányosítással)
Dinamikus tömb - kollekciómetódusok EXISTS(i) COUNT LIMIT FIRST LAST NEXT(i) PRIOR (i) EXTEND, EXTEND(n), EXTEND(n,m) TRIM, TRIM(n) DELETE
TYPE varray_type IS VARRAY(5) OF INTEGER; v1 varray_type; v2 varray_type; v3 varray_type:=varray_type(); v4 varray_type:=varray_type(10,20,30); v2 := varray_type(1, 2, 3, 4, 5);
TYPE name_rec IS RECORD ( first_name VARCHAR2(20), last_name VARCHAR2(25)); TYPE names IS VARRAY(250) OF name_rec; NULL;
TYPE t_nt_emplist IS VARRAY(10) OF employees.employee_id%type; TYPE t_nt_senior_salespeople IS VARRAY(15) OF employees%rowtype; CURSOR c2 IS SELECT first_name, last_name FROM employees; TYPE t_nt_namelist IS VARRAY(5) OF c2%rowtype; NULL;
TYPE dnames_var IS VARRAY(20) OF VARCHAR2(30); dept_names dnames_var; IF dept_names IS NULL THEN DBMS_OUTPUT.PUT_LINE ('Before initialization, the varray is null.'); -- DBMS_OUTPUT.PUT_LINE -- ('It has ' dept_names.count ' elements.'); ELSE DBMS_OUTPUT.PUT_LINE('Before initialization, the varray is not null.'); END IF; dept_names := dnames_var(); IF dept_names IS NULL THEN DBMS_OUTPUT.PUT_LINE ('After initialization, the varray is null.'); ELSE DBMS_OUTPUT.PUT_LINE ('After initialization, the varray is not null.'); END IF; DBMS_OUTPUT.PUT_LINE ('It has ' dept_names.count ' elements.');
TYPE T_Szerzok IS VARRAY (10) OF VARCHAR2(50); v_szerzok T_Szerzok := T_Szerzok(); DBMS_OUTPUT.PUT_LINE('1.count: ' v_szerzok.count ' Limit: ' NVL(TO_CHAR(v_Szerzok.LIMIT), 'NULL')); v_szerzok.ext -- Egy NULL elemmel bővítünk DBMS_OUTPUT.PUT_LINE('2.count: ' v_szerzok.count ' v_szerzok(1): ' NVL(v_Szerzok(1), 'NULL')); v_szerzok(1) := 'Móra Ferenc'; DBMS_OUTPUT.PUT_LINE('2. count: ' v_szerzok.count ' v_szerzok(v_szerzok.count): ' NVL(v_Szerzok(v_Szerzok.COUNT), 'NULL')); v_szerzok.extend(3); -- 3 db NULL elemmel bővítünk DBMS_OUTPUT.PUT_LINE('2. count: ' v_szerzok.count ' v_szerzok(v_szerzok.count): ' NVL(v_Szerzok(v_Szerzok.COUNT), 'NULL'));
v_szerzok.extend(4, 1); DBMS_OUTPUT.PUT_LINE('2. count: ' v_szerzok.count ' v_szerzok(v_szerzok.count): ' NVL(v_Szerzok(v_Szerzok.COUNT), 'NULL')); v_szerzok.extend(10); EXCEPTION WHEN SUBSCRIPT_OUTSIDE_LIMIT THEN DBMS_OUTPUT.PUT_LINE('Kivétel! ' SQLERRM); FOR i IN 1..v_Szerzok.COUNT LOOP DBMS_OUTPUT.PUT_LINE(i ' ' NVL(v_Szerzok(i), 'NULL')); END LOOP;
TYPE dnames_var IS VARRAY(7) OF VARCHAR2(30); dept_names dnames_var := dnames_var('shipping','sales','finance','payroll'); DBMS_OUTPUT.PUT_LINE ('dept_names has ' dept_names.count ' elements now'); DBMS_OUTPUT.PUT_LINE ('dept_names''s type can hold a maximum of ' dept_names.limit ' elements'); DBMS_OUTPUT.PUT_LINE ('The maximum number you can use with ' 'dept_names.extend() is ' (dept_names.limit - dept_names.count));
TYPE T_Szerzok IS VARRAY (10) OF VARCHAR2(50); v_szerzok T_Szerzok; v_szerzok := T_Szerzok('Móricz Zsigmond','Móra Ferenc','Ottlik Géza','Weöres Sándor'); DBMS_OUTPUT.PUT_LINE('1.count: ' v_szerzok.count); v_szerzok.trim; -- Törlünk egy elemet DBMS_OUTPUT.PUT_LINE('2.count: ' v_szerzok.count); v_szerzok.trim(2); -- Törlünk 2 elemet DBMS_OUTPUT.PUT_LINE('3.count: ' v_szerzok.count); v_szerzok.trim(10); -- Megpróbálunk túl sok elemet törölni EXCEPTION WHEN SUBSCRIPT_BEYOND_COUNT THEN DBMS_OUTPUT.PUT_LINE('Kivétel! ' SQLERRM); DBMS_OUTPUT.PUT_LINE('4. count: ' v_szerzok.count);
TYPE last_name_typ IS VARRAY(3) OF VARCHAR2(64); TYPE surname_typ IS VARRAY(3) OF VARCHAR2(64); -- These first two variables have the same data type. group1 last_name_typ:= last_name_typ('jones','wong','marceau'); group2 last_name_typ:= last_name_typ('klein','patsos','singh'); -- This third variable has a similar declaration, -- but is a different type. group3 surname_typ:= surname_typ('trevisi','macleod','marquez'); -- Allowed because they have the same data type group1 := group2; -- Not allowed because they have different data types -- group3 := group2; -- fordítási hiba!
TYPE tb1 IS TABLE OF INTEGER INDEX BY PLS_INTEGER; -- Index-by table of index-by tables: TYPE ntb1 IS TABLE OF tb1 INDEX BY PLS_INTEGER; TYPE va1 IS VARRAY(10) OF VARCHAR2(20); -- Index-by table of varray elements: TYPE ntb2 IS TABLE OF va1 INDEX BY PLS_INTEGER; v1 va1 := va1('hello', 'world'); v2 ntb1; v3 ntb2; v4 tb1; v5 tb1; -- empty table v4(1) := 34; v4(2) := 46456; v4(456) := 343; v2(23) := v4; v3(34) := va1(33, 456, 656, 343); -- assign an empty table to v2(35) and try again v2(35) := v5; v2(35)(2) := 78; -- it works now
TYPE t1 IS VARRAY(10) OF INTEGER; TYPE nt1 IS VARRAY(10) OF t1; -- multilevel varray type va t1 := t1(2,3,5); -- initialize multilevel varray nva nt1 := nt1(va, t1(55,6,73), t1(2,4), va); i INTEGER; va1 t1; -- multilevel access i := nva(2)(3); -- i will get value 73 DBMS_OUTPUT.PUT_LINE('I = ' i); -- add a varray element to nva nva.ext -- replace inner varray elements nva(5) := t1(56, 32); nva(4) := t1(45,43,67,43345); -- replace an inner integer element nva(4)(4) := 1; -- replaces 43345 with 1 -- add an element to the 4th varray element -- and store integer 89 into it. nva(4).ext nva(4)(5) := 89;
Kollekciók Beágyazott tábla 1 TYPE név IS TABLE OF elemtípus [NOT NULL]; Speciális objektumtípus az ilyen típusú változó tulajdonképpen egy referencia Max. 2 31 eleme lehet (1-től indexelünk) Az elemek szétszórtan helyezkednek el (lyukak!)
TYPE t_dt_emplist IS TABLE OF employees.employee_id%type; TYPE t_dt_senior_salespeople IS TABLE OF employees%rowtype; CURSOR c2 IS SELECT first_name, last_name FROM employees; TYPE t_nt_namelist IS TABLE OF c2%rowtype; NULL;
TYPE nested_type IS TABLE OF VARCHAR2(30); v1 nested_type:= nested_type('shipping','sales','finance',' Payroll'); v2 nested_type:=nested_type(); v3 nested_type; null;
TYPE t_nevek IS TABLE OF VARCHAR2(10); v_nevek t_nevek; v_nevek2 t_nevek:=t_nevek(); PROCEDURE URES_E(p_Nevek t_nevek) IS IF p_nevek IS NULL THEN DBMS_OUTPUT.PUT_LINE('NULL értékű kollekció'); ELSIF p_nevek.count=0 THEN DBMS_OUTPUT.PUT_LINE('Üres kollekció'); END IF; URES_E(v_Nevek); URES_E(v_Nevek2);
Beágyazott tábla - kollekciómetódusok EXISTS(i) COUNT LIMIT FIRST LAST NEXT(i) PRIOR (i) EXTEND, EXTEND(n), EXTEND(n,m) TRIM, TRIM(n) DELETE, DELETE(i), DELETE(i,j)
TYPE NumList IS TABLE OF INTEGER; n NumList := NumList(1,3,5,7); n.delete(2); -- Delete the second element IF n.exists(1) THEN DBMS_OUTPUT.PUT_LINE('OK, element #1 exists.'); END IF; IF n.exists(2) = FALSE THEN DBMS_OUTPUT.PUT_LINE('OK, element #2 was deleted.'); END IF; IF n.exists(99) = FALSE THEN DBMS_OUTPUT.PUT_LINE('OK, element #99 does not exist at all.'); END IF;
TYPE NumList IS TABLE OF NUMBER; n NumList := NumList(1,3,5,7); counter INTEGER; DBMS_OUTPUT.PUT_LINE('N''s first subscript is ' n.first); DBMS_OUTPUT.PUT_LINE('N''s last subscript is ' n.last); FOR i IN n.first.. n.last LOOP DBMS_OUTPUT.PUT_LINE('Element #' i ' = ' n(i)); END LOOP; n.delete(2); -- Delete second element. IF n IS NOT NULL THEN counter := n.first; WHILE counter IS NOT NULL LOOP DBMS_OUTPUT.PUT_LINE('Element #' counter ' = ' n(counter)); counter := n.next(counter); END LOOP; ELSE DBMS_OUTPUT.PUT_LINE('N is null, nothing to do.'); END IF;
TYPE NumList IS TABLE OF NUMBER; n NumList := NumList(1966,1971,1984,1989,1999); DBMS_OUTPUT.PUT_LINE('The element after #2 is #' n.next(2)); DBMS_OUTPUT.PUT_LINE('The element before #2 is #' n.prior(2)); n.delete(3); -- Delete an element to show how NEXT can handle gaps. DBMS_OUTPUT.PUT_LINE('Now the element after #2 is #' n.next(2)); IF n.prior(n.first) IS NULL THEN DBMS_OUTPUT.PUT_LINE ('Can''t get PRIOR of the first element.'); END IF;
TYPE NumList IS TABLE OF NUMBER; n NumList := NumList(1,3,5,7); counter INTEGER; n.delete(2); counter := n.first; WHILE counter IS NOT NULL LOOP DBMS_OUTPUT.PUT_LINE ('Counting up: Element #' counter ' = ' n(counter)); counter := n.next(counter); END LOOP; counter := n.last; WHILE counter IS NOT NULL LOOP DBMS_OUTPUT.PUT_LINE ('Counting down: Element #' counter ' = ' n(counter)); counter := n.prior(counter); END LOOP;
TYPE NumList IS TABLE OF NUMBER; n NumList := NumList(2,4,6,8); -- Collection starts with 4 elements. DBMS_OUTPUT.PUT_LINE ('There are ' n.count ' elements in N.'); n.extend(3); -- Add 3 elements at the end. DBMS_OUTPUT.PUT_LINE ('Now there are ' n.count ' elements in N.'); n := NumList(86,99); -- Assign a value with 2 elements. DBMS_OUTPUT.PUT_LINE ('Now there are ' n.count ' elements in N.'); n.trim(2); -- Remove the last 2 elements, leaving none. DBMS_OUTPUT.PUT_LINE ('Now there are ' n.count ' elements in N.');
declare type t is table of number(5); v t:=t(1,2,3,4); begin v.delete(2); v.extend(3,2); end; --no_data_found
CREATE PACKAGE personnel AS TYPE staff_list IS TABLE OF employees.employee_id%type; PROCEDURE award_bonuses (empleos_buenos IN staff_list); END personnel; CREATE PACKAGE BODY personnel AS PROCEDURE award_bonuses (empleos_buenos staff_list) IS FOR i IN empleos_buenos.first..empleos_buenos.last LOOP UPDATE employees SET salary = salary + 100 WHERE employees.employee_id = empleos_buenos(i); END LOOP;
good_employees personnel.staff_list; good_employees:= personnel.staff_list(100,103,107); personnel.award_bonuses(good_employees);
TYPE Roster IS TABLE OF VARCHAR2(15); names Roster := Roster('D Caruso','J Hamil','D Piro','R Singh'); PROCEDURE verify_name(the_name VARCHAR2) IS DBMS_OUTPUT.PUT_LINE(the_name); FOR i IN names.first.. names.last LOOP IF names(i) = 'J Hamil' THEN DBMS_OUTPUT.PUT_LINE(names(i)); END IF; END LOOP; verify_name(names(3));
TYPE NumList IS TABLE OF NUMBER; n NumList := NumList(1,2,3,5,7,11); PROCEDURE print_numlist(the_list NumList) IS output VARCHAR2(128); IF n.count = 0 THEN DBMS_OUTPUT.PUT_LINE('No elements in collection.'); ELSE FOR i IN the_list.first.. the_list.last LOOP output := output NVL(TO_CHAR(the_list(i)),'NULL') ' '; END LOOP; DBMS_OUTPUT.PUT_LINE(output); END IF;
print_numlist(n); n.trim(2); print_numlist(n); n.trim; print_numlist(n); n.trim(n.count); -- Remove all remaining elements. print_numlist(n); n := NumList(1,2,3); n.trim(100); EXCEPTION WHEN SUBSCRIPT_BEYOND_COUNT THEN DBMS_OUTPUT.PUT_LINE ('There weren''t 100 elements to be trimmed.'); n := NumList(1,2,3,4); n.delete(3); n.trim(2); print_numlist(n);
TYPE CourseList IS TABLE OF VARCHAR2(10); courses CourseList; courses := CourseList('Biol 4412', 'Psyc 3112', 'Anth 3001'); courses.delete(courses.last); courses.trim(courses.count); DBMS_OUTPUT.PUT_LINE(courses(1)); Result: Biol 4412
TYPE NumList IS TABLE OF NUMBER; n NumList := NumList(10,20,30,40,50,60,70,80,90,100); n.delete(2); -- deletes element 2 n.delete(3,6); -- deletes elements 3 through 6 n.delete(7,7); -- deletes element 7 n.delete(6,3); -- does nothing since 6 > 3 n.delete; -- deletes all elements
TYPE t_nevek IS TABLE OF VARCHAR2(10); v_nevek t_nevek:=t_nevek('a1,'b2,'c3,'d4,'e5', 'F6','G7','H8','I9','J10'); i PLS_INTEGER; DBMS_OUTPUT.PUT_LINE('1. count: ' v_nevek.count); v_nevek.delete(3); -- Törlünk pár elemet v_nevek.delete(6, 8); v_nevek.delete(10, 12); v_nevek.delete(60); DBMS_OUTPUT.PUT_LINE('2. count: ' v_nevek.count); i := v_nevek.first; WHILE i IS NOT NULL LOOP DBMS_OUTPUT.PUT_LINE(i ' ' v_nevek(i)); i := v_nevek.next(i); END LOOP;
TYPE tb1 IS TABLE OF VARCHAR2(20); TYPE Ntb1 IS TABLE OF tb1; -- table of table elements TYPE Tv1 IS VARRAY(10) OF INTEGER; TYPE ntb2 IS TABLE OF tv1; -- table of varray elements vtb1 tb1 := tb1('one', 'three'); vntb1 ntb1 := ntb1(vtb1); vntb2 ntb2 := ntb2(tv1(3,5), tv1(5,7,3)); -- table of varray elements vntb1.ext vntb1(2) := vntb1(1); -- delete the first element in vntb1 vntb1.delete(1); -- delete the first string -- from the second table in the nested table vntb1(2).delete(1);
Beágyazott tábla és dinamikus tömb NULL értéke tesztelhető. Beágyazott táblák egyenlősége is vizsgálható akkor, ha azonos típusúak és az elemek is összehasonlíthatók egyenlőség szerint. A rekordot tartalmazó beágyazott tábla és bármilyen elemű dinamikus tömb vagy asszociatív tömb egyenlőségvizsgálata fordítási hibát eredményezne.
TYPE dnames_tab IS TABLE OF VARCHAR2(30); dept_names dnames_tab:=dnames_tab('shipping','sales', 'Finance','Payroll'); -- Initialized to non-null value empty_set dnames_tab; -- Not initialized, therefore null PROCEDURE print_dept_names_status IS IF dept_names IS NULL THEN DBMS_OUTPUT.PUT_LINE('dept_names is null.'); ELSE DBMS_OUTPUT.PUT_LINE('dept_names is not null.'); END IF; END print_dept_names_status; print_dept_names_status; dept_names := empty_set; -- Assign null collection to dept_names. print_dept_names_status; dept_names := dnames_tab('shipping','sales','finance','payroll'); -- Re-initialize dept_names print_dept_names_status;
TYPE Foursome IS VARRAY(4) OF VARCHAR2(15); team Foursome; IF team IS NULL THEN DBMS_OUTPUT.PUT_LINE('team IS NULL'); ELSE DBMS_OUTPUT.PUT_LINE('team IS NOT NULL'); END IF; Result: team IS NULL
TYPE dnames_tab IS TABLE OF VARCHAR2(30); dept_names1 dnames_tab:= dnames_tab('shipping','sales', 'Finance','Payroll'); dept_names2 dnames_tab := dnames_tab('sales','finance', 'Shipping','Payroll'); dept_names3 dnames_tab := dnames_tab('sales', 'Finance','Payroll'); IF dept_names1 = dept_names2 THEN DBMS_OUTPUT.PUT_LINE('dept_names1 = dept_names2'); END IF; IF dept_names2!= dept_names3 THEN DBMS_OUTPUT.PUT_LINE('dept_names2!= dept_names3'); END IF;
Kollekciók Kivételek COLLECTION_IS_NULL: NULL értékű kollekcióra metódus meghívása (az EXISTS kivételével) SUBSCRIPT_BEYOND_COUNT: az elemszámnál nagyobb indexű elemre hivatkozáskor (dinamikus tömb vagy beágyazott tábla esetén) SUBSCRIPT_OUTSIDE_LIMIT: érvényes tartományon kívüli indexhivatkozás esetén (pl. -1) (dinamikus tömb vagy beágyazott tábla esetén) NO_DATA_FOUND: nem létező elemre történő hivatkozáskor VALUE_ERROR: ha az index NULL, vagy nem konvertálható a kulcs típusára
TYPE WordList IS TABLE OF VARCHAR2(5); words WordList; err_msg VARCHAR2(100); PROCEDURE display_error IS err_msg := SUBSTR(SQLERRM, 1, 100); DBMS_OUTPUT.PUT_LINE('Error message = ' err_msg); words(1) := 10; EXCEPTION WHEN OTHERS THEN display_error; words := WordList('1st', '2nd', '3rd'); words(3) := words(1) '+2'; words(3) := 'longer than 5 characters'; EXCEPTION WHEN OTHERS THEN display_error;
words('b') := 'dunno'; EXCEPTION WHEN OTHERS THEN display_error; words(0) := 'zero'; EXCEPTION WHEN OTHERS THEN display_error; words(4) := 'maybe'; EXCEPTION WHEN OTHERS THEN display_error; words.delete(1); IF words(1) = 'First' THEN NULL; END IF; EXCEPTION WHEN OTHERS THEN display_error;
TYPE NumList IS TABLE OF NUMBER; nums NumList := NumList(10,20,30); -- initialize table nums.delete(-1); -- does not raise SUBSCRIPT_OUTSIDE_LIMIT nums.delete(3); -- delete 3rd element DBMS_OUTPUT.PUT_LINE(nums.COUNT); -- prints 2 nums(3) := 30; -- allowed; does not raise NO_DATA_FOUND DBMS_OUTPUT.PUT_LINE(nums.COUNT); -- prints 3 Result: 2 3
declare type t_dt is varray(5) of number(3); v_dt t_dt; begin begin dbms_output.put_line(v_dt(1)); exception when others then dbms_output.put_line(sqlcode ' ' sqlerrm); --collection_is_null end; begin v_dt:=t_dt(1,5,7); v_dt.extend(3,2); exception when others then dbms_output.put_line(sqlcode ' ' sqlerrm); --subscript_outside_limit end;
begin v_dt:=t_dt(1,5,7); dbms_output.put_line(v_dt(4)); exception when others then dbms_output.put_line(sqlcode ' ' sqlerrm); --subscript_beyond_count end; begin v_dt:=t_dt(1,5,7); dbms_output.put_line(v_dt(-1)); exception when others then dbms_output.put_line(sqlcode ' ' sqlerrm); --subscript_outside_limit end; begin v_dt:=t_dt(1,5,7); dbms_output.put_line(v_dt('a')); exception when others then dbms_output.put_line(sqlcode ' ' sqlerrm); --value_error end; end;
declare type t_at is table of number(3) index by pls_integer; v_at t_at; begin begin dbms_output.put_line(v_at(1)); exception when others then dbms_output.put_line(sqlcode ' ' sqlerrm); --no_data_found end; begin v_at(5):=1; v_at(4):=2; v_at('a'):=3; exception when others then dbms_output.put_line(sqlcode ' ' sqlerrm); --value_error end; end;