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(m , n ) tar bort alla element i intervallet m .. n . Om m är större än n eller om m eller n är null, DELETE(m , n ) 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