Zu Oracle

Bereich:
Versionsinfo:
DBA, PL/SQL
getestet mit 10.2, 11.1, 11.2
Erstellung:
Letzte Überarbeitung:
12/2004 HA
05/2009 MP
 Als PDF Downloaden!

Arbeiten mit Nested Tables unter 10g

Mit Version 10g wurden die Funktionalitäten zum Arbeiten mit Nested Tables erheblich erweitert. Neu eingeführt wurden:

  • Möglichkeit des Vergleichs mit =, <= oder IN
  • Neue Multiset-Operatoren
  • Neue Bedingungen
  • Neue Funktionen

Diese neuen Funktionalitäten sind nur für Nested Tables nutzbar, nicht jedoch für Index By-Tabellen ("Associative Arrays") oder Varrays. Bei der Auswertung der enthaltenen Elemente spielt deren Reihenfolge keine Rolle.
Alle neuen Funktionalitäten sind sowohl in SQL als auch in PL/SQL nutzbar. Die beteiligten Nested Table-Variablen bzw. -Spalten müssen natürlich vom gleichen Basistyp sein.

Anmerkung: Als SET bezeichnet Oracle eine Sammlung von Elementen, die keine Duplikate enthält.

 

Neue Multiset-Operatoren

Diese speziell für Nested Tables neu eingeführten Operatoren liefern als Ergebnis stets wieder eine Nested Table vom gleichen Typ wie die beteiligten Operanden. Sie sind analog zu den den SET-Operatoren zu sehen (Der Default ist jeweils unterstrichen):

  • nt1 MULTISET EXCEPT [ALL | DISTINCT] nt2 ist analog zu MINUS: In der Ergebnis-Table sind alle Elemente enthalten, die in nt1, nicht aber in nt2 enthalten sind.

  • nt1 MULTISET INTERSECT [ALL | DISTINCT] nt2 ist analog zu INTERSECT: In der Ergebnis-Table sind alle Elemente enthalten, die in nt1 und in nt2 enthalten sind.

  • nt1 MULTISET UNION [ALL | DISTINCT] nt2 ist analog zu UNION [ALL]: Die Ergebnis-Table ist die Vereinigung aller Elemente aus nt1 und nt2.

Bei mehrfachem Vorkommen des gleichen Elements werden bei Angabe von ALL doppelte Einträge nicht eliminiert, bei Angabe von DISTINCT dagegen schon.

 

Beispiel:

DECLARE
   TYPE ttable IS TABLE OF NUMBER;
   v1 ttable := ttable(1, 2, 3, 3);
   v2 ttable := ttable (3, 3, 1, 1, 4);    
   result ttable;
BEGIN
   result := v1 MULTISET UNION v2;              -- (1, 2, 3, 3, 3, 3, 1, 1, 4)
   result := v1 MULTISET UNION DISTINCT v2;     -- (1, 2, 3, 4)
   result := v1 MULTISET INTERSECT v2;          -- (1, 3, 3)
   result := v1 MULTISET INTERSECT DISTINCT v2; -- (1, 3)
   result := v2 MULTISET EXCEPT v1;             -- (1, 4)
   result := v2 MULTISET EXCEPT DISTINCT v1;    -- (4)
END;

 

Neue Bedingungen


Auch eine Reihe neuer Bedingungen wurde speziell für Nested Tables eingeführt:

  • ausdruck MEMBER [OF] nt: überprüft, ob der angegebene ausdruck als Wert in der Nested Table nt enthalten ist.
  • nt IS [NOT] EMPTY: überprüft, ob nt [nicht] leer ist
  • nt IS [NOT] A SET: überprüft, ob nt Duplikate enthält (IS NOT A SET) oder nicht (IS A SET).
  • nt1 SUBMULTISET [OF] nt2: überprüft, ob alle Elemente aus nt1 auch in nt2 enthalten sind

 

Neue Funktionen

  • Auch die folgenden neu eingeführten Funktionen sind auf Nested Tables beschränkt:
  • CARDINALITY(nt): gibt die Anzahl von Elementen in nt zurück Datentyp: NUMBER
  • SET(nt): gibt eine Nested Table zurück, die alle unterschiedlichen Elemente (ohne Duplikate) aus nt enthält Datentyp: Nested Table


Beispiele:

DECLARE
   TYPE ttable IS TABLE OF NUMBER;
   v1      ttable := ttable(1, 2, 3, 3);
   v2      ttable := ttable(1, 2, 3);
   result  BOOLEAN;
   v_count NUMBER;
BEGIN
   result := v2 SUBMULTISET OF v1;         -- (TRUE)
   result := v1 NOT SUBMULTISET OF v2;     -- (TRUE)
   result := 2 MEMBER OF v1;               -- (TRUE)
   result := v1 IS A SET;                  -- (FALSE)
   result := v1 IS EMPTY;                  -- (FALSE)
   v_count := CARDINALITY(v1);             -- (4)
   v_count := CARDINALITY(SET(v1));        -- (3)
END;

 

Suche

Kontakt

Telefon:
  089 6228 6789-0

Telefon (gültig bis Ende 2010):
  089 679090-40

E-Mail Verteiler Monatstipps

Bitte nehmen Sie mich in den Verteiler der monatlichen Tipps & Tricks auf.