sql >> Database teknologi >  >> RDS >> Oracle

Sådan bruger du Oracle PLSQL-tabeller (associativ array eller indeks-for-tabel)

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(mn ) fjerner alle elementer i området m .. n . Hvis m er større end n eller hvis m eller n er null, DELETE(mn ) 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


  1. Hvordan sender man sqlparameter til IN()?

  2. CAST og IsNumeric

  3. Sådan viser du filer i en mappe med SQL Server

  4. Sådan fungerer implicitte transaktioner i SQL Server