Datenbanken mi iQ
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:

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):

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:

 

Neue Funktionen


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;