элементы, включая дублирующиеся.
■ DISTINCT Означает, что в выходную таблицу будут включены только
различные (недублирующиеся) элементы из входных вложенных
таблиц. Например, MULTISET UNION DISTINCT возвращает вложенную
таблицу, элементы которой установлены в сумму элементов из двух
представленных вложенных таблиц, но выходная вложенная таблица
не содержит дублирующиеся значения.
Применение MULTISET иллюстрирует процедура multiset_example():
□ CREATE PROCEDURE multiset_example AS
TYPE t_nested_table IS TABLE OF VARCHAR2(10);
v_customer_nested_table1 t_nested_table :=
t_nested_table(‘ Fred’ , ‘ George’ , ‘ Susan’ );
v_customer_nested_table2 t_nested_table :=
t_nested_table(' George’ , ‘ Steve’ , ‘ Rob’ );
v_customer_nested_table3 t_nested_table;
v_count INTEGER;
BEGIN
-- используем MULTISET UNION (возвращает вложенную таблицу, элементы которой
представляют собой сумму элементов двух указанных вложенных таблиц)
v_customer_nested_table3 :=
v_customer_nested_table1 MULTISET UNION v_customer_nested_table2-
DBMSJDUTPUT. PUT('UNION: ') ;
FOR v_count IN 1.. v_customer_nested_table3.COUNT LOOP
DBMSJDUTPUT.PUT(v_customer_nested_table3(v_count) || ' ')•
END LOOP;
DBMS_0UTPUT.PUT_LINE(' ') ;
используем MULTISET UNION DISTINCT (DISTINCT показывает, что только
недублирующиеся элементы двух указанных вложенных таблиц
— установлены в возвращаемой вложенной таблице)
v_customer_nested_table3 :=
v_customer_nested_table1 MULTISET UNION DISTINCT v_customer_nested_
table2 ;
DBMS_0UTPUT.PUT('UNION DISTINCT: ') ;
FOR v_count IN 1 ..v_customer_nested_table3.COUNT LOOP
DBMSJDUTPUT. PUT(v_customer_nestedJ:able3(v_count) || ' ')■
END LOOP;
DBMS_0UTPUT.PUT_LINE(' ') ;
используем MULTISET INTERSECT (возвращает вложенную таблицу, элементы
которой
представляют собой общие для двух указанных вложенных таблиц элементы)
v_customer_nested_table3 :=
v_customer_nested_table1 MULTISET INTERSECT v_customer_nested_table2;
DBMSJDUTPUT.PUT(’ INTERSECT: ’ );
486 Глава 13
FOR v_count IN 1 . .v_customer_nested_table3.COUNT LOOP
DBMS_OUTPUT. PUT(v_custoiner_nested_table3(v_count) || ' ') ;
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ') ;
— используем MULTISET EXCEPT (возвращает вложенную таблицу, элементы
которой
— есть в первой указанной вложенной таблице, но отсутствуют во второй)
v_customer_nested_table3 :=
v_customer_nested_table1 MULTISET EXCEPT v_customer_nested_table2;
DBMSJXJTPUT.PUTC EXCEPT: ') ;
FOR v_count IN 1 ..v_customer_nested_table3.COUNT LOOP
DBMS_OUTPUT.PUT(v_customer_nested_table3(v_count) || ' ') ;
END LOOP;
END multiset_example;
/
В следующем примере вызывается multiset_example():
□ CALL multiset_example();
UNION: Fred George Susan Ceorge Steve Rob
UNION DISTINCT: Fred George Susan Steve Rob
INTERSECT: George
EXCEPT:
Функция C AR D IN A L IT YO
Функция CARDINALITYO возвращает количество элементов во вложенной
таблице. Процедура cardinality_example() иллюстрирует применение
CARDINALITYO:
П CREATE PROCEDURE cardinality_example AS
TYPE t_nested_table IS TABLE OF VARCHAR2(10);
v_customer_nested_table1 t_nested_table :=
t_nested_table(‘ Fred’ , ‘ George’ , ’ Susan’ );
v_cardinality INTEGER;
BEGIN
— вызываем CARDINALITYO, чтобы получить количество элементов
— в v _ c u s tom e r _ n e s te d _ t a b le 1
v _ c a r d i n a l i t y := C A R D IN A L IT Y ( v _ c u s tom e r_ n e s t e d _ t a b le 1 );
D BM S _O U T P U T .P U T _ L IN E ( 'v _ c a rd in a l i t y = 1 || v _ c a r d i n a l i t y ) ;
END cardinality_example;
/
В следующем примере вызывается cardinality_example():
□ CALL c a r d i n a l i t y _ e x a m p l e ( ) ;
v _ c a r d i n a l i t y = 3
Оператор M EM B E R O F
Оператор MEMBER OF используется для проверки, является ли данный элемент
членом вложенной таблицы. Процедура member_of_example() иллюстрирует
применение оператора MEMBER OF:
Коллекции 487
□ CREATE PROCEDURE member_of_example AS
TYPE t_nested_table IS TABLE OF VARCHAR2(10);
v_customer_nested_table1 t_nested_table :=
t_nested_table(‘ Fred’ , ‘ George’ , ‘ Susan’ );
v_result BOOLEAN;
BEGIN
— используем MEMBER OF для проверки, входит ли ‘ George’
в v_customer_nested_table1 (он входит, поэтому v_result устанавливается
в true)
v_result := 'George' MEMBER OF v_customer_nested_table1;
IF v_result THEN
DBMS_OUTPUT.PUT_LINE(' ' ' GEORGE» is a member');
END IF;
END member_of_example;
/
В следующем примере вызывается member_of_example():
□ CALL member_of_example();
GEORGE is a member
Функция SET()
Функция SET сначала превращает вложенную таблицу во множество, удаляет
из него повторяющиеся элементы, а затем возвращает оставшиеся
элементы как вложенную таблицу. Процедура SET_example() иллюстрирует
применение функции SET:
□ CREATE PROCEDURE set_example AS
TYPE t_nested_table IS TABLE OF VARCHAR2(10);
v_customer_nested_table1 t_nested_table :=
t_nested_table(' Fred’ , ‘ George’ , ‘ Susan’ , ‘ George’ );
v_customer_nested_table2 t_nested_table;
v_count INTEGER;
BEGIN
вызываем SET() для преобразования вложейной таблицы во множество,
удаления дублирующихся элементов из множества, и получения
— множества как вложенной таблицы
v_customer_nested_table2 := SET(v_customer_nested_table1 );
DBMS_OUTPUT.PUT( ' v_customer_nested_table2: ') ;
FOR v_count IN 1 ..v_customer_nested_table2.COUNT LOOP
DBMS_OUTPUT.PUT(' v_customer_nested_table2(v_count) || ' ')■
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ') ;
END set_example;
/
В следующем примере вызывается SET_example():