Összetett típusok Rekordtípus

Hasonló dokumentumok
Együttes hozzárendelés

Tranzakciókezelés PL/SQL-ben

Adatbázisban tárolt kollekciók

Kivételkezelés 2. SQLCODE lehetséges értékei:

B IT MAN 65/1. Adatbázis Rendszerek II. Ellenőrző kérdések APLSQL B IT MAN. v:

PL/SQL 1. rész. Procedural Language extension to SQL

Összefoglaló. <variable_name> [IN OUT IN OUT] <data_type> [:=<default_value>] ... <label_name>: <statements>... GOTO <label_name>;...

Adatbázis Rendszerek II. 5. PLSQL Csomagok 16/1B IT MAN

SQL/PSM kurzorok rész

Csomag. Adatbázis-objektum Programozási eszközök gyűjteménye Két részből áll. specifikáció törzs (opcionális)

Adattípusok. Max. 2GByte

Adattípusok. Max. 2GByte

Haladó DBMS ismeretek 1

PL/SQL (folytatás) Kurzorok, függvények, eljárások

Adatbázis Rendszerek II. 2. Ea: Gyakorló környezet

Adatbázisok-I. előadás dr. Hajas Csilla (ELTE IK)

Tábla létrehozása: CREATE TABLE alma( ID INT( 3 ) NOT NULL PRIMARY KEY, Leiras VARCHAR( 100 ) );

5. téma XML DB. Az adatkezelés és XML kapcsolata. Miért fontos az XML használata az adatbázis kezelésben?

Adattípusok. Tartomány, műveletek, reprezentáció Altípus: azonos műveletek és reprezentáció, szűkebb tartomány Osztályozás:

Adatbázis Rendszerek II. 2. Gyakorló környezet

PL/SQL blokk. [címke] [DECLARE deklarációs utasítás(ok)] BEGIN végrehajtható utasítás(ok) [EXCEPTION kivételkezelő] END [név];

Collections. Összetett adatstruktúrák

Kalmár György Adatbázis alapú rendszerek

B I T M A N B I v: T M A N

Triggerek. Olyan névvel ellátott adatbázisobjektumok, amelyek eseményorientált feldolgozást tesznek lehetővé

INDEXSTRUKTÚRÁK III.

Adatbázis Rendszerek II. 4. PLSQL Kurzorok, hibakezelés 53/1B IT MAN

Algoritmizálás és adatmodellezés tanítása 1. előadás

PL/SQL feladatok 8. gyakorlat

Széchenyi István Egyetem

8-9.előadás: Adatbázisok-I. dr. Hajas Csilla (ELTE IK)

Adatbázisok. 8. gyakorlat. SQL: CREATE TABLE, aktualizálás (INSERT, UPDATE, DELETE), SELECT október október 26. Adatbázisok 1 / 17

Adatbázis Rendszerek II. 3. PLSQL alapok 92/1B IT MAN

Mapping Sequencing Reads to a Reference Genome

A PL/SQL motor. A PL/SQL nyelvű egységek fordítását és futtatását végző rendszer. az adatbázis-kezelőben fejlesztőeszközben (pl.

Apple Swift kurzus 3. gyakorlat

Tankönyvben: SQL/PSM Gyakorlaton: Oracle PL/SQL

8. Gyakorlat SQL. DDL (Data Definition Language) adatdefiníciós nyelv utasításai:

Adatbázisok* tulajdonságai

A trigger egy aktualizálási művelet esetén végrehajtandó programrészletet definiál. Alakja:

Smalltalk 2. Készítette: Szabó Éva

Adatbázis-kezelés. Harmadik előadás

Táblakezelés: Open SQL Internal table. Tarcsi Ádám: Az SAP programozása 1.

On The Number Of Slim Semimodular Lattices

Oracle Spatial. Térbeli adatot tartalmazó tábla: Geometry table Legalább 2 oszlopa van: Elsődleges kulcs, SDO_GEOMETRY típusú oszlop.

Adatbázis Rendszerek II. 6. PLSQL Triggerek 32/1B IT MAN

Operációs Rendszerek II. labor. 2. alkalom

Programozás alapjai. 5. előadás

Vektoros grafikát tároló adatbázisok. Katona Endre Térképi adatbázisok diasorozata alapján

Kilencedik témakör: Lazarus-Firebird. Készítette: Dr. Kotsis Domokos

Correlation & Linear Regression in SPSS

16F628A megszakítás kezelése

SZÁMÍTÓGÉPES PROBLÉMAMEGOLDÁS

Hozzunk ki többet abból amink van. Fehér Lajos

(Asking for permission) (-hatok/-hetek?; Szabad ni? Lehet ni?) Az engedélykérés kifejezésére a következő segédigéket használhatjuk: vagy vagy vagy

Visual Basic elméleti leti alapok 2.

BEVEZETÉS Az objektum fogalma

Java és web programozás

Using the CW-Net in a user defined IP network

SQL*Plus. Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

B I T M A N B I v: T M A N

.Net adatstruktúrák. Készítette: Major Péter

ORACLE. SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

Proxer 7 Manager szoftver felhasználói leírás

Miskolci Egyetem Gazdaságtudományi Kar Üzleti Információgazdálkodási és Módszertani Intézet. Correlation & Linear. Petra Petrovics.

SQL haladó. Külső összekapcsolások, Csoportosítás/Összesítés, Beszúrás/Törlés/Módosítás, Táblák létrehozása/kulcs megszorítások

Adatbázis kezelés Delphiben. SQL lekérdezések

SQL OO elemei aktív komponensek

Create & validate a signature

3. MINTAFELADATSOR KÖZÉPSZINT. Az írásbeli vizsga időtartama: 30 perc. III. Hallott szöveg értése

SQLServer. DB Recovery modes

Karakterkészlet. A kis- és nagybetűk nem különböznek, a sztringliterálok belsejét leszámítva!

WEBFEJLESZTÉS 2. ADATBÁZIS-KEZELÉS, OSZTÁLYOK

Adatbázis rendszerek SQL nyomkövetés

Bel SE Hungary IDPA. Stage 1st: Running to you 1. pálya: Lerohanás. Course Designer:Attila Belme

Database Systems II. ZH összefoglaló

Teszt topológia E1/1 E1/0 SW1 E1/0 E1/0 SW3 SW2. Kuris Ferenc - [HUN] Cisco Blog -

Objektum relációs lehetőségek az Oracle-ben. Katona Endre Adatbázis alapú rendszerek diasorozata alapján

Debreceni Egyetem Informatikai Kar TANULÓI NYILVÁNTARTÓ SZOFTVER FIREBIRD ADATBÁZIS ALKALMAZÁSÁVAL

BASH script programozás II. Vezérlési szerkezetek

T Á J É K O Z T A T Ó. A 1108INT számú nyomtatvány a webcímen a Letöltések Nyomtatványkitöltő programok fülön érhető el.

Adatbáziskezelés php-ben MySQL adatbáziskezelı rendszert használva

Kifejezések. Kozsik Tamás. December 11, 2016

SQL DDL-1: táblák és megszorítások

Indexek és SQL hangolás

Algoritmusok Tervezése. 4. Előadás Visual Basic 1. Dr. Bécsi Tamás

Kliens oldali SQL-API

betűk, az angol kis- ás nagybetűk: A Z és a z; számjegyek: 0 9; egyébkarakterek: ()+-/<>=!~^;:.@%,#$&{}?[] szóköz, tabulátor, kocsivissza.

Java és web programozás

OOP: Java 4.Gy: Java osztályok

Jegyz könyv. Adatbázis-rendszerek II. Beadandó feladat. Miskolci Egyetem

SQL ALAPOK. Bevezetés A MYSQL szintaxisa Táblák, adatok kezelésének alapjai

Tulajdonságalapú tesztelés

Adatbázis Rendszerek I. 10. SQL alapok (DML esettanulmány)

SZERVER OLDALI JAVASCRIPT. 3. hét Javascript nyelvi elemek

Correlation & Linear Regression in SPSS

Programozás burritokkal

ANGOL NYELV KÖZÉPSZINT SZÓBELI VIZSGA I. VIZSGÁZTATÓI PÉLDÁNY

Utasítások. Excel VII. Visual Basic programozás alapok. A Visual Basic-kel megoldható feladatok típusai Objektumok, változók Alprogramok

Készítette: Szabóné Nacsa Rozália

Átírás:

Ö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;