Als PDF Downloaden!

Werbung
Tipps & Tricks: Dezember 2004
Bereich:
DBA, PL/SQL
Erstellung:
12/2004 HA
Versionsinfo:
getestet mit 10.2, 11.1, 11.2
Letzte Überarbeitung:
05/2009 MP
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
Muniqsoft GmbH
Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40
IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0
Seite 1 von 2
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;
Muniqsoft GmbH
Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40
IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0
Seite 2 von 2
Herunterladen