TAKTUM Logo


Oracle Schulung
Oracle Schulung

Oracle PL/SQL Tutorial: Tables
Funktionsweise von PL/SQL-Tables (Arrays)

Deklaration 

PL/SQL-Tables sind dynamische eindimensionale Arrays. Die Indizierung der Elemente erfolgt über beliebige ganze Zahlen (max. 10 Stellen, Typ BINARY_INTEGER). Im Gegensatz zu anderen Programmiersprachen können Elemente beliebig im Array verteilt werden. Es ist keine sequentielle Indizierung notwendig. So lassen sich wahlfreie Zugriffe realisieren, in dem z.B. eine Auftragsnummer als Index verwendet wird, um Daten eines Auftrags als Element des Arrays abzulegen. Als Elementtypen sind alle PL/SQL-Typen zugelassen. Zur Deklaration einer Array-Variablen muß zunächst die Deklaration eines Typs erfolgen, die das Array beschreibt:

DECLARE

TYPE table_typ IS TABLE OF datentyp [ NOT NULL ]
      INDEX BY BINARY_INTEGER;

variable table_typ;

Beispiel

DECLARE

  TYPE auftrag_table_typ IS TABLE OF auftrag%ROWTYPE
          INDEX BY BINARY_INTEGER;

  auftrag_table auftrag_table_typ;

  TYPE auftrag_bearbeitet_table_typ IS TABLE OF boolean
          INDEX BY BINARY_INTEGER;

  auftrag_bearbeitet_table auftrag_bearbeitet_table_typ;

Verwendung von PL/SQL - Tables 

Indizierung

variable(index) := wert;

wert := variable(index);

Beispiele

auftrag_bearbeitet_table (4711) := TRUE;

if not auftrag_bearbeitet_table (4711) then ...

select * into auftrag_table (4711)
  from auftrag
  where auftrag_nr = 4711;

Ein Element wird dadurch erzeugt, dass ihm ein Wert zugewiesen wird. Der Zugriff auf ein nicht vorhandenes Element führt zu einer Exception NO_DATA_FOUND. Jedes Element muß einzeln erzeugt werden. Das komplette oder teilweise Laden von Datenbank-Tabellen in eine PL/SQL-Table ist nicht möglich. Jede Zeile muß einzeln über einen Fetch in die Table geschrieben werden.

PL/SQL - Table - Attribute 

EXISTS(n)  

Prüft, ob ein Element existiert.

Beispiel:

if not auftrag_bearbeitet_table.exists(4711) then
  auftrag_bearbeitet_table (4711) := FALSE;
end if;

COUNT 

Zählt die Elemente der Table.

Beispiel:

v_anzahl := auftrag_bearbeitet_table.count;

FIRST und LAST 

Bestimmt den ersten bzw. letzten Index der Table.

Liefert NULL bei einer leeren Table

Beispiel:

v_start := auftrag_bearbeitet_table.first;

PRIOR(n) und NEXT(n)  

Bestimmt zu einem Index den nächsten bzw. vorherigen Index, zu dem ein Element existiert. Liefert NULL, wenn kein solches Element existiert.

Beispiel:

v_naechster := auftrag_bearbeitet_table.next (v_start);

DELETE, DELETE(n), DELETE(n,m)  

  • Löschen aller Elemente einer Table (ohne Parameter)
  • Löschen eines Elementes einer Table (ein Parameter)
  • Löschen eines Bereiches von Elementen einer Table (zwei Parameter)

Beispiel:

auftrag_bearbeitet_table.delete (0,100);

Löscht alle Elemente mit dem Index 0 bis 100.

Alle Elemente einer PL/SQL-Table durchlaufen 

declare

  TYPE auftrag_table_typ IS TABLE OF auftrag%ROWTYPE
          INDEX BY BINARY_INTEGER;

  auftrag_table auftrag_table_typ;

  v_index BINARY_INTEGER;

begin

  v_index := auftrag_table.first;

  while v_index is not NULL loop

    bearbeiten des Elementes auftrag_table(v_index)

    v_index := auftrag_table.next (v_index);

  end loop;

end;



Stichwörter

Tables Table Array Arrays Collection Collections EXISTS COUNT FIRST LAST PRIOR NEXT DELETE Beispiel Beispiele