Выбрать главу

элементы, включая дублирующиеся.

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