Oracle PLSQL-tabellen
- PLSQL-tabellen zijn samengestelde gegevenstypen.
- Deze gedragen zich op dezelfde manier als arrays, behalve dat ze geen bovengrenzen hebben, waardoor ze constant kunnen worden uitgebreid.
- Ze worden ook index per tabel genoemd
- PLSQL-tabel bevat twee elementen
(1) Een primaire sleutel van BINARY_INTEGER datatypes die de tabel indexeren, die niet opeenvolgend hoeven te zijn. De verzameling wordt uitgebreid door waarden toe te wijzen aan een element met behulp van een indexwaarde die momenteel niet bestaat.
we kunnen ook indexeren met een tekenreekswaarde
(2) Een kolom van scalair of record datatype die de index opslaat door tabelelementen
Tabeltype definiëren en declareren
Om PL/SQL-tabellen te maken, voert u twee stappen uit. Eerst definieert u een TABLE-type en declareert u vervolgens PL/SQL-tabellen van dat type. U kunt TABLE-typen definiëren in het declaratieve deel van elk blok, subprogramma of pakket met behulp van de syntaxis
Syntax TYPE table_type_name IS TABLE OF datatype [NOT NULL] INDEX BY BINARY_INTEGER;
Als het elementtype een recordtype is, moet elk veld in het record een scalair gegevenstype hebben, zoals CHAR, DATE of NUMBER.
Om het elementtype te specificeren, kunt u %TYPE gebruiken om het gegevenstype van een variabele of databasekolom op te geven
DECLARE TYPE DEPTTabTyp IS TABLE OF dept.dept_name%TYPE INDEX BY BINARY_INTEGER;
U kunt de beperking NOT NULL toevoegen aan een definitie van het TABLE-type en zo het opslaan van nulls in PL/SQL-tabellen van dat type voorkomen:
DECLARE TYPE DEPTTabTyp IS TABLE OF dept.location%TYPE NOT NULL INDEX BY BINARY_INTEGER;
U kunt ook %ROWTYPE gebruiken om het elementtype op te geven.
DECLARE TYPE deptTabTyp IS TABLE OF dept%ROWTYPE INDEX BY BINARY_INTEGER;
u gebruikt een door de gebruiker gedefinieerd RECORD-type om het elementtype te specificeren:
DECLARE TYPE emp_phonetyp IS RECORD ( Stdcode PLS_INTEGER, phn_number PLS_INTEGER, extension PLS_INTEGER ); TYPE emp_contact IS TABLE OF emp_phonetyp INDEX BY BINARY_INTEGER;
Nadat u een TABLE-type hebt gedefinieerd, kunt u PL/SQL-tabellen van dat type declareren
DECLARE TYPE SalTabTyp IS TABLE OF emp.sal%TYPE INDEX BY BINARY_INTEGER; TYPE EmpTabTyp IS TABLE OF emp%ROWTYPE INDEX BY BINARY_INTEGER; sal_tab SalTabTyp; -- declare PL/SQL table emp_tab EmpTabTyp; -- declare another PL/SQL table
PLSQL-tabelkenmerken of -methode
Een PL/SQL-tabel heeft de attributen EXISTS, COUNT, FIRST, LAST, PRIOR, NEXT en DELETE.
Ze maken PL/SQL-tabellen gemakkelijker te gebruiken en uw applicaties gemakkelijker te onderhouden.
plsql_table_name.attribute_name |
De attributen bestaan, PRIOR, NEXT en DELETE nemen parameters. Elke parameter moet een expressie zijn die een BINARY_INTEGER-waarde oplevert of een waarde die impliciet naar dat gegevenstype kan worden geconverteerd.
DELETE werkt als een procedure, die wordt aangeroepen als een instructie. De andere PL/SQL-tabelattributen werken echter als een functie, die wordt aangeroepen als onderdeel van een expressie.
Bestaat(n) | Retourneer true als het nde element in de tabel bestaat |
tel | Geef het aantal elementen in de tabel terug |
Eerste en laatste | EERSTE en LAATSTE geven de eerste en laatste (kleinste en grootste) indexcijfers in een PL/SQL-tabel terug |
PRIOR(n ) | retourneert het indexnummer dat voorafgaat aan index n in een PL/SQL-tabel |
VOLGENDE(n ) | retourneert het indexnummer dat volgt op index n |
Verwijderen | DELETE verwijdert alle elementen uit een PL/SQL-tabel. VERWIJDEREN(n ) verwijdert de n het element. Als n is null, DELETE(n ) doet niets. VERWIJDEREN(m , n ) verwijdert alle elementen in het bereik m .. n . Als m is groter dan n of als m of n is null, DELETE(m , n ) doet niets |
PL/SQL-tabellen om bulkgegevens van en naar databasetabellen of tussen client-side applicaties en opgeslagen subprogramma's te verplaatsen.
Hoe de gegevens in de PLSQL-tabel te vullen
Tabellen met eenvoudige datatypes kunnen worden ingevuld als:
<variable>(<integer>) := <value>;
Voor tabellen met complexe gegevenstypen moeten de kolommen afzonderlijk worden ingevuld als:
<variable>(<integer>).<column_name> := <value>;
Of van een cursor:
fetch <cursor_name> into <variable>(<integer>);
Type emptabletype is table of varchar2(10)
Index by binary_integer;
emp_table emptabletyp;
emp_table (1) := ‘good’;
emp_table (2) := ‘bad’’;
U kunt Oracle-gegevens ook op drie andere manieren in een PL/SQL-tabel ophalen
a) Met de SELECT INTO-instructie kunt u een enkele rij gegevens selecteren
Met de instructie SELECT INTO kunt u een kolominvoer in een scalair element selecteren. Of u kunt een hele rij in een recordelement selecteren. In het volgende voorbeeld selecteert u een rij uit de databasetabel dept in een record opgeslagen door het eerste element van de PL/SQL-tabel dept_tab:
DECLARE
TYPE DeptTabTyp IS TABLE OF dept%ROWTYPE
INDEX BY BINARY_INTEGER;
dept_tab DeptTabTyp;
BEGIN
/* Select entire row into record stored by first element. */
SELECT * INTO dept_tab(1) FROM dept WHERE deptno = 10;
IF dept_tab(1).dname = 'ACCOUNTING' THEN ...
...
END;
b) FETCH-instructie
Met de FETCH-instructie kunt u een hele kolom Oracle-gegevens ophalen in een PL/SQL-tabel met scalaire waarden.
Of u kunt een hele tabel met Oracle-gegevens ophalen in een PL/SQL-tabel met records.
DECLARE
TYPE EmpTabTyp IS TABLE OF emp%ROWTYPE
INDEX BY BINARY_INTEGER;
emp_tab EmpTabTyp;
i BINARY_INTEGER := 0;
CURSOR c1 IS SELECT * FROM emp;
BEGIN
OPEN c1;
LOOP
i := i + 1;
/* Fetch entire row into record stored by ith element. */
FETCH c1 INTO emp_tab(i);
EXIT WHEN c1%NOTFOUND;
-- process data record
END LOOP;
CLOSE c1;
END;
c) cursor FOR loop laat je meerdere rijen ophalen.
DECLARE
TYPE EnameTabTyp IS TABLE OF emp.ename%TYPE
INDEX BY BINARY_INTEGER;
TYPE SalTabTyp IS TABLE OF emp.sal%TYPE
INDEX BY BINARY_INTEGER;
ename_tab EnameTabTyp;
sal_tab SalTabTyp;
n BINARY_INTEGER := 0;
BEGIN
/* Fetch entire columns into PL/SQL tables. */
FOR emp_rec IN (SELECT ename, sal FROM emp) LOOP
n := n + 1;
ename_tab(n) := emp_rec.ename;
sal_tab(n) := emp_rec.sal;
END LOOP;
...
END;
Je moet deze andere PLSQL-berichten lezen
Oracle PLSQL-blokstructuur en -typen
Oracle PLSQL-records
Oracle plsql-interviewvragen
Snelle Oracle-sql- en plsql-zelfstudies