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

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

вложенную таблицу, элементы которой являются суммой элементов

из двух представленных таблиц, а в возвращаемой таблице есть все