t a b le 1,
— v_customer_nested_table2, и v_customer_nested_table3;
- - эти объекты используются для хранения имён покупателей
v_customer_nested_table1 t_ n e s te d _ ta b le :=
t_ n e s te d _ ta b le ( ' F re d ', 'Georg e', 'S u sa n ');
v_customer_nested_table2 t_ n e s te d _ ta b le :=
t_ n e s te d _ ta b le ( ' F re d ’ , 'Georg e', 'Susan );
v_customer_nested_table3 t_ n e s te d _ ta b le :=
t_ n e s te d _ ta b le ( ' John', 'Georg e', 'Susan );
v _ r e s u lt BOOLEAN;
BEGIN
— используем оператор = для сравнения v_customer_nested_table1
— и v_customer_nested_table2 (они содержат одинаковые имена,
— поэтому v _ re s u lt будет установлен в tru e )
v _ re s u lt := v_customer_nested_table1 = v_customer_nested_table2;
IF v _ re s u lt THEN
DBMS_OUTPUT.PUT_LINE(
' v_customer_nested_table1 equal to v_customer_nested_table2
);
END IF;
— используем оператор <> для сравнения v_customer_nested_table1
— и v_customer_nested_table3 (они неравны, так как имена,
- - ‘ Fred ’ и ‘ John’ , отличаются, и v _ re s u lt будет установлен в tru e )
v _ re s u lt := v_customer_nested_table1 <> v_customer_nested_table3;
IF v _ r e s u lt THEN
DBMS_OUTPUT.PUT_LINE(
' v_customer_nested_table1 not equal to v_customer_nested_table3
);
END IF;
END equal_example;
/
Коллекции 483
В следующем примере вызывается equal_example():
□ CALL equal_example();
v_customer_nested_table1 equal to v_customer_nested_table2
v_customer_nested_table1 not equal to v_customer_nested_table3
Операторы IN и N O T IN
Операторы IN и NOT IN используются для проверки, встречается ли содержимое
одной вложенной таблицы в другой вложенной таблице или нет.
Применение IN и NOT IN иллюстрирует процедура in_example():
□ CREATE PROCEDURE in_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(‘ John’ , ‘ George’ , ‘ Susan’ );
v_customer_nested_table3 t_nested_table :=
t_nested_table( ‘ Fred’ , ‘ George’ , ‘ Susan’ );
result BOOLEAN;
BEGIN - -
используем оператор IN для проверки того, что элементы v_customer_
nested_table3
входят в v_customer_nested_table1 (они входят, поэтому v_result
— устанавливается в true)
v_result := v_customer_nested_table3 IN(v_customer_nested_table1 );
IF v_result THEN
DBMS_0UTPUT.PUT_LINE(
'v_customer_nested_table3 in v_customer_nested_table1’
); END IF;
используем оператор NOT IN для проверки того, что элементы v_
customer_nested_table3
не входят в v_customer_nested_table2 (они не входят, поэтому v_result
— устанавливается в true)
v_result := v_customer_nested_table3 NOT IN(v_customer_nested_table2 );
IF v_result THEN
DBMS_0UTPUT.PUT_LINE(
' v_customer_nested_table3 not in v_customer_nested_table2'
);
END IF;
END in_example;
/
В следующем примере вызывается in_example():
□ CALL in_example();
v_customer_nested_table3 in v_customer_nested_table1
v_customer_nested_table3 not in v_customer_nested_table2
484 Глава 13
Оператор S U BM U L T IS E T
Оператор SUBMULTISET используется для проверки, является содержимое
одной вложенной таблицы подмножеством содержимого другой вложенной
таблицы, или нет. Применение SUBMULTISET иллюстрирует процедура
submultiset_example ():
□ CREATE PROCEDURE submultiset_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_customer_nested_table2 t_ n e s te d _ ta b le :=
t_ n e s te d _ ta b le ( ‘ G e o rg e ', ‘ F red’ , ‘ Susan’ , ‘ John , Steve ),
v _ re s u lt BOOLEAN;
BEGIN
— используем оператор SUBMULTISET OF для проверки того, что
— элементы v_customer_nested_table1 являются подмножеством v_customer_
nested_table2
— (они являются, поэтому v _ r e s u lt устанавливается в tru e )
v _ re s u lt :=
v_customer_nested_table1 -SUBMULTISET OF v_customer_nested_table2;
IF v _ re s u lt THEN
DBMSJDUTPUT.PUT_LINE(
' v_customer_nested_table1 subset o f v_custoirier_nested_table2
);
END IF;
END submultiset_example;
/
В следующем примере вызывается submultiset_example():
□ CALL submultiset_example();
v customer_nested_table1 subset o f v_customer_nested_table2
Оператор M U LT IS E T
Оператор MULTISET используется для получения вложенной таблицы, элементы
которой устанавливаются равными определенным комбинациям
элементов двух вложенных таблиц, являющихся входом для операторов
MULTISET. Есть три вида операторов MULTISET.
■ MULTISET UNION. Возвращает вложенную таблицу, которая включают
в себя элементы обеих входных вложенных таблиц.
■ MULTISET INTERSECT. Возвращает вложенную таблицу, элементы которой
являются общими для обеих входных вложенных таблиц.
■ MULTISET EXCEPT. Возвращает вложенную таблицу, элементы которой
входят в первую входную вложенную таблицу, но не входят во
вторую.
С операторами MULTISET можно использовать одну из следующих опций.
■ ALL Означает, что в выходную таблицу будут включены все подходящие
элементы из входных вложенных таблиц. Опция ALL является
значением по умолчанию. Например, MULTISET UNION ALL возвращает
Коллекции 485
вложенную таблицу, элементы которой являются суммой элементов
из двух представленных таблиц, а в возвращаемой таблице есть все