sql >> Databasteknik >  >> RDS >> Oracle

Hur man använder Oracle PLSQL-tabeller (associativ array eller index-för-tabell)

Oracle PLSQL-tabeller

  • PLSQL-tabeller är sammansatta datatyper.
  • Dessa beter sig på samma sätt som arrayer förutom att de inte har några övre gränser, vilket gör att de hela tiden kan utökas.
  • De kallas också index för tabell
  • PLSQL-tabellen innehåller två element

(1) En primärnyckel av BINARY_INTEGER datatyper som indexerar tabellen, som inte behöver vara konsekutiva. Samlingen utökas genom att tilldela värden till ett element med ett indexvärde som för närvarande inte finns.
vi kan också indexera med ett strängvärde

(2) En kolumn med skalär eller postdatatyp som lagrar indexet efter tabellelement

Hur man definierar och deklarerar tabelltyp

För att skapa PL/SQL-tabeller tar du två steg. Först definierar du en TABLE-typ och deklarerar sedan PL/SQL-tabeller av den typen. Du kan definiera TABELL-typer i den deklarativa delen av alla block, underprogram eller paket med hjälp av syntaxen

Syntax 
 TYPE table_type_name IS TABLE OF datatype [NOT NULL] INDEX BY BINARY_INTEGER;

Om elementtypen är en posttyp måste varje fält i posten ha en skalär datatyp som CHAR, DATE eller NUMBER.

För att specificera elementtypen kan du använda %TYPE för att ange datatypen för en variabel eller databaskolumn

DECLARE 
 TYPE DEPTTabTyp IS TABLE OF dept.dept_name%TYPE INDEX BY BINARY_INTEGER;

Du kan lägga till NOT NULL-begränsningen i en TABLE-typdefinition och på så sätt förhindra lagring av nollvärden i PL/SQL-tabeller av den typen:

DECLARE 
 TYPE DEPTTabTyp IS TABLE OF dept.location%TYPE NOT NULL INDEX BY BINARY_INTEGER;

Du kan också använda %ROWTYPE för att ange elementtypen.

DECLARE 
 TYPE deptTabTyp IS TABLE OF dept%ROWTYPE INDEX BY BINARY_INTEGER;

du använder en User Define RECORD-typ för att ange 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 definierat en TABLE-typ kan du deklarera PL/SQL-tabeller av den typen

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-tabellattribut eller metod

En PL/SQL-tabell har attributen EXISTS, COUNT, FIRST, LAST, PRIOR, NEXT och DELETE.

De gör PL/SQL-tabeller enklare att använda och dina applikationer lättare att underhålla.

plsql_table_name.attribute_name

Attributen finns, PRIOR, NEXT och DELETE take-parametrar. Varje parameter måste vara ett uttryck som ger ett BINARY_INTEGER-värde eller ett värde som implicit kan konverteras till den datatypen.

DELETE fungerar som en procedur, som kallas som ett uttalande. De andra PL/SQL-tabellattributen fungerar dock som en funktion, som anropas som en del av ett uttryck.

Finns(n) Returnera sant om det n:te elementet i tabellen finns
räkning Returnera antalet element i tabellen
Första och sista FIRST och LAST returnerar det första och sista (minsta och största) indexnumret i en PL/SQL-tabell
PRIOR(n ) returerar indexnumret som föregår index n i en PL/SQL-tabell
NEXT(n ) returerar indexnumret som efterträder index n
Ta bort DELETE tar bort alla element från en PL/SQL-tabell. DELETE(n ) tar bort n det elementet. Om n är null, DELETE(n ) gör ingenting. DELETE(mn ) tar bort alla element i intervallet m .. n . Om m är större än n eller om m eller n är null, DELETE(mn ) gör ingenting

PL/SQL-tabeller för att flytta bulkdata in i och ut ur databastabeller eller mellan applikationer på klientsidan och lagrade underprogram.

Hur man fyller i data i PLSQL-tabell

Tabell med enkla datatyper kan fyllas i som:

<variable>(<integer>) := <value>;

Tabell med komplexa datatyper behöver kolumnerna fyllas i individuellt som:

<variable>(<integer>).<column_name> := <value>;

Eller från 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 även hämta Oracle-data till en PL/SQL-tabell på tre andra sätt

a) SELECT INTO-satsen låter dig välja en enda rad med data

Med hjälp av SELECT INTO-satsen kan du välja en kolumnpost i ett skalärt element. Eller så kan du välja en hel rad till ett postelement. I följande exempel väljer du en rad från databastabellen avd till en post som lagras av det första elementet 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-sats

Med FETCH-satsen kan du hämta en hel kolumn med Oracle-data till en PL/SQL-tabell med skalärer.

Eller så kan du hämta en hel tabell med Oracle-data till en PL/SQL-posttabell.

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 låter dig hämta flera rader.

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 måste läsa dessa  andra PLSQL-inlägg

Oracle PLSQL-blockstruktur och -typer
Oracle PLSQL-poster
Oracle plsql-intervjufrågor
Snabbtutorials för Oracle sql och plsql


  1. Fel vid försök att köra pgAdmin4

  2. Förstå Big Data Analytics

  3. Hämta kolumndefinition för resultatuppsättning för lagrad procedur

  4. Vad är MariaDB? Hur fungerar MariaDB?