Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So verwenden Sie Oracle PLSQL-Tabellen (assoziatives Array oder Index-by-Tabelle)

Oracle PLSQL-Tabellen

  • PLSQL-Tabellen sind zusammengesetzte Datentypen.
  • Diese verhalten sich genauso wie Arrays, außer dass sie keine Obergrenzen haben, wodurch sie sich ständig erweitern können.
  • Sie werden auch Index by Table genannt
  • PLSQL-Tabelle enthält zwei Elemente

(1) Ein Primärschlüssel von BINARY_INTEGER-Datentypen, die die Tabelle indizieren, die nicht fortlaufend sein müssen. Die Sammlung wird erweitert, indem einem Element Werte zugewiesen werden, indem ein Indexwert verwendet wird, der derzeit nicht vorhanden ist.
Wir können auch durch einen Zeichenfolgenwert indizieren

(2) Eine Spalte vom Skalar- oder Datensatz-Datentyp, die den Index nach Tabellenelementen speichert

Wie man den Tabellentyp definiert und deklariert

Um PL/SQL-Tabellen zu erstellen, müssen Sie zwei Schritte ausführen. Zuerst definieren Sie einen TABLE-Typ und deklarieren dann PL/SQL-Tabellen dieses Typs. Sie können TABLE-Typen im deklarativen Teil jedes Blocks, Unterprogramms oder Pakets mit der Syntax

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

Wenn der Elementtyp ein Datensatztyp ist, muss jedes Feld im Datensatz einen skalaren Datentyp wie CHAR, DATE oder NUMBER haben.

Um den Elementtyp anzugeben, können Sie %TYPE verwenden, um den Datentyp einer Variablen oder Datenbankspalte anzugeben

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

Sie können die Einschränkung NOT NULL zu einer TABLE-Typdefinition hinzufügen und so das Speichern von Nullen in PL/SQL-Tabellen dieses Typs verhindern:

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

Sie können auch %ROWTYPE verwenden, um den Elementtyp anzugeben.

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

Sie verwenden einen benutzerdefinierten RECORD-Typ, um den Elementtyp anzugeben:

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;

Nachdem Sie einen TABLE-Typ definiert haben, können Sie PL/SQL-Tabellen dieses Typs deklarieren

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

Attribute oder Methode der PLSQL-Tabelle

Eine PL/SQL-Tabelle hat die Attribute EXISTS, COUNT, FIRST, LAST, PRIOR, NEXT und DELETE.

Sie erleichtern die Verwendung von PL/SQL-Tabellen und die Wartung Ihrer Anwendungen.

plsql_table_name.attribute_name

Die Attribute exist, PRIOR, NEXT und DELETE übernehmen Parameter. Jeder Parameter muss ein Ausdruck sein, der einen BINARY_INTEGER-Wert oder einen implizit in diesen Datentyp konvertierbaren Wert liefert.

DELETE verhält sich wie eine Prozedur, die als Anweisung aufgerufen wird. Die anderen PL/SQL-Tabellenattribute verhalten sich jedoch wie eine Funktion, die als Teil eines Ausdrucks aufgerufen wird.

Existiert(n) Gib wahr zurück, wenn das n-te Element in der Tabelle existiert
Zählung Gibt die Anzahl der Elemente in der Tabelle zurück
Erster und letzter FIRST und LAST geben die erste und letzte (kleinste und größte) Indexnummer in einer PL/SQL-Tabelle zurück
PRIOR(n ) gibt die Indexnummer zurück, die dem Index n vorausgeht in einer PL/SQL-Tabelle
WEITER(n ) gibt die Indexnummer zurück, die auf Index n folgt
Löschen DELETE entfernt alle Elemente aus einer PL/SQL-Tabelle. DELETE(n ) entfernt das n tes Element. Wenn n null ist, DELETE(n ) tut nichts. DELETE(mn ) entfernt alle Elemente im Bereich m .. n . Wenn m ist größer als n oder wenn m oder n null ist, DELETE(mn ) tut nichts

PL/SQL-Tabellen zum Verschieben von Massendaten in und aus Datenbanktabellen oder zwischen clientseitigen Anwendungen und gespeicherten Unterprogrammen.

So füllen Sie die Daten in der PLSQL-Tabelle aus

Tabellen mit einfachen Datentypen können gefüllt werden als:

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

Bei Tabellen mit komplexen Datentypen müssen die Spalten einzeln gefüllt werden als:

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

Oder von einem 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’’;

Sie können Oracle-Daten auch auf drei andere Arten in eine PL/SQL-Tabelle abrufen

a) Mit der Anweisung SELECT INTO können Sie eine einzelne Datenzeile auswählen

Mit der Anweisung SELECT INTO können Sie einen Spalteneintrag in einem Skalarelement auswählen. Oder Sie können eine ganze Zeile in einem Datensatzelement auswählen. Im folgenden Beispiel wählen Sie eine Zeile aus der Datenbanktabelle dept in einen Datensatz aus, der vom ersten Element der PL/SQL-Tabelle dept_tab gespeichert wird:

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-Anweisung

Mit der FETCH-Anweisung können Sie eine ganze Spalte von Oracle-Daten in eine PL/SQL-Tabelle von Skalaren holen.

Oder Sie können eine ganze Tabelle mit Oracle-Daten in eine PL/SQL-Tabelle mit Datensätzen abrufen.

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) Mit der Cursor-FOR-Schleife können Sie mehrere Zeilen abrufen.

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;

Sie müssen diese  anderen PLSQL-Beiträge lesen

Oracle PLSQL-Blockstruktur und -Typen
Oracle PLSQL-Datensätze
Oracle plsql-Interviewfragen
Schnelle Oracle sql- und plsql-Tutorials