□ CALL set_example();
v_customer_nested_table2: Fred George Susan
488 Глава 13
Оператор IS A SET
Оператор IS A SET используется для проверки, являются ли все элементы
вложенной таблицы различными. Процедура is_a_set_example() иллюстрирует
применение оператора IS A SET:
□ CREATE PROCEDURE is_a_set_example AS
TYPE t_ n e s te d _ ta b le IS TABLE OF VARCHAR2(10);
v_customer_nested_table1 t_ n e s te d _ ta b le :=
t_ n e s te d _ ta b le (1 Fred ’ , ‘ George’ , ‘ Susan , George ),
v _ r e s u lt BOOLEAN;
BEGIN
- - используем оператор IS A SET для проверки того, что элементы в
— v_customer_nested_table1 являются различными (они не являются,
- - поэтому v _ re s u lt устанавливается в f a ls e )
v _ r e s u lt := v_customer_nested_table1 IS A SET;
IF v _ r e s u lt THEN
DBMS_0UTPUT.PUT_LINE('Elements are a l l u n iq u e ');
ELSE
DBMS_0UTPUT.PUT_LINE(' El ement s co nta in d u p l i c a t e s );
END IF; "
END is_a_set_example;
/
В следующем примере вызывается is_a_set_example():
□ CALL is_a_set_example();
E lement s c o nta in d u p l i c a t e s
Оператор IS EM P T Y
Оператор IS EMPTY используется для проверки, содержит ли элементы вложенная
таблица. Процедура is_empty_example() иллюстрирует применение
оператора IS EMPTY:
□ CREATE PROCEDURE is_empty_example AS
TYPE t_ n e s te d _ ta b le IS TABLE OF VARCHAR2(10);
v_customer_nested_table1 t_ n e s te d _ ta b le :=
t_ n e s te d _ ta b le ( ‘ Fred’ , ‘ George’ , ‘ Susan’ );
v _ r e s u lt BOOLEAN;
BEGIN
- - используем оператор IS EMPTY для проверки того, является ли
— v_customer_nested_table1 пустой (она не являются,
- - поэтому v _ re s u lt устанавливается в f a ls e )
v _ r e s u lt := v_customer_nested_table1 IS EMPTY;
IF v _ r e s u lt THEN
DBMS_0UTPUT.PUT_LINE('Nested t a b le i s empt y ' ) ;
ELSE
DBMS_0UTPUT.PUT_LINE(' Nested t a b le co n t a in s elements );
END IF;
END is_empty_example;
/
В следующем примере вызывается is_empty_example():
Коллекции 489
□ CALL is_empty_example();
Nested table contains elements
Функция C O L L E C T ()
Функция C0LLECT() возвращает список значений в виде вложенной таблицы.
Следующий запрос иллюстрирует применение COLLECT():
□ SELECT COLLECT(first_name)
FROM customers_with_varray;
COLLECT( FIRST_NAME)
SYSTPxBtv6XzZXLjgNAADug9CQQ==(' Steve’ , ‘ John’ )
Вы можете использовать CAST() для преобразования элементов, возвращаемых
COLLECT( ) , в конкретный тип, как показано в следующем запросе:
П SELECT CAST(COLLECT( first_name) AS t_table)
FROM customers_with_varray;
CAST(COLLECT(FIRST_NAME)AST_TABLE)
T_TABLE(‘ Steve’ , ‘ John’ )
Для сведения: тип t_table, который был использован в предыдущем
примере, создаётся при помощи следующего выражения в сценарии
collection_schema3.sqclass="underline"
□ CREATE TYPE t„table AS TABLE OF VARCHAR2(10);
/
Функция POW ERM U LT ISE TO
Функция POWERMULTISETO возвращает все комбинации элементов в заданной
вложенной таблице, как показано в следующем запросе:
□ SELECT *
FROM TABLE(
POWERMULTISET( t_ ta b le (' This’ , ‘ i s’ , ‘ a’ , ‘ test ’ ))
);
COLUMN_VALUE
T_TABLE
TJABLE
T_TABLE
T_TABLE
T_TABLE
T_TABLE
T_TABLE
T_TABLE
T_TABLE
T_TABLE
T_TABLE
T_TABLE
T_TABLE
T_TABLE
T TABLE
1 This’
1 i s ’ )
1 This’
a’ )
This’
i s ’ ,
This’
te s t ’
This’
i s’ ,
This’
a' , '
This’
i s’ ,
This’
)
, ‘ i s ’ )
, ‘ a’ )
‘ a’ )
, ‘ i s ’ , ' a’ )
)
, ‘ test ’ )
‘ test ’ )
, ‘ i s’ , ' test ’ )
test ’ )
, ‘ a’ , ‘ test ’ )
‘ a’ , ‘ test ’ )
, ‘ i s’ , ‘ a’ , ‘ test ’
490 Глава 13
Ф у н к ц и я P O W E R M U L T IS E T _ B Y _ C A R D IN A L IT Y ( )
Функция POWERMULTISET_BY_CARDINALITY возвращает комбинации элементов
из данной вложенной таблицы, которые имеют заданное количество элементов.
Следующий запрос иллюстрирует применение POWERMULTISET_BY_
0ARDINALITYO:
□ SELECT *
FROM TABLE(
POWERMULTISET_BY_CARDINALITY(
t_nested_table(1 This’ , ‘ i s’ , ’ a’ , ‘ test ’ ), 3
)
);
COLUMN_VALUE
T_TABLE(' This’ , ‘ i s’ , ‘ a’ )
T_TABLE( ‘ This’ , ‘ i s’ , ‘ test ’ )
T_TABLE(' This’ , ‘ a’ , ‘ test ’ )
T_TABLE(‘ i s ’ , ‘ a’ , ‘ test ’ )
Итоги
В этой главе вы узнали, что
■ Коллекции позволяют хранить множества элементов.
■ Есть три типа коллекций: массивы переменной длины, вложенные
таблицы и ассоциативные массивы.
■ Массив переменной длины похож на массив в Java; можно использовать
этот массив для хранения упорядоченного множества элементов,
с каждым из которых связан индекс. Все элементы массива переменной
длины относятся к одному типу, а у самого массива одно измерение.
У массива переменной длины есть максимальный размер, задаваемый
при создании массива, который впоследствии можно изменить.
■ Вложенная таблица - это таблица, встроенная в другую таблицу, и в
которую можно вставлять, модифицировать или удалять индивидуальные
элементы. Поскольку можно модифицировать индивидуальные
элементы, вложенные таблицы являются более гибким средством,