Oracle PLSQL-tabeller
- PLSQL-tabeller er sammensatte datatyper.
- Disse opfører sig på samme måde som arrays, bortset fra at de ikke har nogen øvre grænser, hvilket tillader dem konstant at udvide sig.
- De kaldes også indeks for tabel
- PLSQL-tabel indeholder to elementer
(1) En primær nøgle af BINARY_INTEGER datatyper, der indekserer tabellen, som ikke behøver at være fortløbende. Samlingen udvides ved at tildele værdier til et element ved hjælp af en indeksværdi, der ikke eksisterer i øjeblikket.
vi er også i stand til at indeksere efter en strengværdi
(2) En kolonne med skalar- eller postdatatype, som gemmer indekset efter tabelelementer
Sådan defineres og deklareres tabeltype
For at oprette PL/SQL-tabeller tager du to trin. Først definerer du en TABLE-type og erklærer derefter PL/SQL-tabeller af den type. Du kan definere TABLE-typer i den deklarative del af enhver blok, underprogram eller pakke ved hjælp af syntaksen
Syntax TYPE table_type_name IS TABLE OF datatype [NOT NULL] INDEX BY BINARY_INTEGER;
Hvis elementtypen er en posttype, skal hvert felt i posten have en skalær datatype såsom CHAR, DATE eller NUMBER.
For at angive elementtypen kan du bruge %TYPE til at angive datatypen for en variabel eller databasekolonne
DECLARE TYPE DEPTTabTyp IS TABLE OF dept.dept_name%TYPE INDEX BY BINARY_INTEGER;
Du kan tilføje NOT NULL-begrænsningen til en TABLE-typedefinition og dermed forhindre lagring af nuller i PL/SQL-tabeller af den type:
DECLARE TYPE DEPTTabTyp IS TABLE OF dept.location%TYPE NOT NULL INDEX BY BINARY_INTEGER;
Du kan også bruge %ROWTYPE til at angive elementtypen.
DECLARE TYPE deptTabTyp IS TABLE OF dept%ROWTYPE INDEX BY BINARY_INTEGER;
du bruger en brugerdefineret RECORD-type til at angive elementtypen:
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;
Når du har defineret en TABLE-type, kan du erklære PL/SQL-tabeller af den type
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-tabelattributter eller -metode
En PL/SQL-tabel har attributterne EXISTS, COUNT, FIRST, LAST, PRIOR, NEXT og DELETE.
De gør PL/SQL-tabeller nemmere at bruge og dine applikationer nemmere at vedligeholde.
plsql_table_name.attribute_name |
Attributterne findes, PRIOR, NEXT og DELETE take-parametre. Hver parameter skal være et udtryk, der giver en BINARY_INTEGER-værdi eller en værdi, der implicit kan konverteres til den pågældende datatype.
SLET fungerer som en procedure, der kaldes som en erklæring. De andre PL/SQL-tabelattributter fungerer dog som en funktion, der kaldes som en del af et udtryk.
Eksisterer(n) | Returner sand, hvis n'te element i tabellen findes |
tæller | Returner antallet af elementer i tabellen |
Første og sidste | FØRSTE og SIDSTE returnerer det første og sidste (mindste og største) indekstal i en PL/SQL-tabel |
PRIOR(n ) | returnerer indeksnummeret, der går forud for indeks n i en PL/SQL-tabel |
NEXT(n ) | returnerer det indeksnummer, der efterfølger indeks n |
Slet | DELETE fjerner alle elementer fra en PL/SQL-tabel. SLET(n ) fjerner n element. Hvis n er null, DELETE(n ) gør ingenting. SLET(m , n ) fjerner alle elementer i området m .. n . Hvis m er større end n eller hvis m eller n er null, DELETE(m , n ) gør intet |
PL/SQL-tabeller til at flytte bulkdata ind og ud af databasetabeller eller mellem klientsideapplikationer og lagrede underprogrammer.
Sådan udfyldes dataene i PLSQL-tabel
Tabeller med simple datatyper kan udfyldes som:
<variable>(<integer>) := <value>;
Tabeller med komplekse datatyper skal have kolonnerne udfyldt individuelt som:
<variable>(<integer>).<column_name> := <value>;
Eller fra en markør:
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’’;
Du kan også hente Oracle-data ind i en PL/SQL-tabel på tre andre måder
a) SELECT INTO-sætning lader dig vælge en enkelt række data
Ved at bruge SELECT INTO-sætningen kan du vælge en kolonneindgang i et skalarelement. Eller du kan vælge en hel række til et postelement. I det følgende eksempel vælger du en række fra databasetabellen afd. til en post, der er gemt af det første element i PL/SQL-tabellen 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-sætning
Med FETCH-sætningen kan du hente en hel kolonne med Oracle-data ind i en PL/SQL-tabel med skalarer.
Eller du kan hente en hel tabel med Oracle-data til en PL/SQL-tabel med poster.
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 lader dig hente flere rækker.
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;
Du skal læse disse andre PLSQL-indlæg
Oracle PLSQL-blokstruktur og -typer
Oracle PLSQL-poster
Oracle plsql-interviewspørgsmål
Hurtige Oracle sql- og plsql-øvelser