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
definierenSyntax 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(m , n ) entfernt alle Elemente im Bereich m .. n . Wenn m ist größer als n oder wenn m oder n null ist, DELETE(m , n ) 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