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