sql >> Database >  >> RDS >> Oracle

Oracle PLSQL-tabellen gebruiken (associatieve array of index-by-tabel)

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(mn ) verwijdert alle elementen in het bereik m .. n . Als m is groter dan n of als m of n is null, DELETE(mn ) 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


  1. VOOR XML PATH(''):Speciale tekens ontsnappen

  2. tabelnaam doorgeven als plsql-parameter

  3. Hoe een json-array in rijen in postgres te veranderen

  4. postgresql date_trunc naar willekeurige precisie?