Рассмотрим функции для работы с nested tables и varrays (11G)
Сделаем nested tables для примеров:
create or replace type test_number_table as table of number(20);
CARDINALITY
CARDINALITY возвращает число элеметов в nested table. Тип возращаемого значения NUMBER.
Если вложенная таблица пустая или is null, тогда CARDINALITY вернет NULL.
SQL> select CARDINALITY(test_number_table(1,2,3,4,5,1,2)) as t_cardinality from dual; T_CARDINALITY ------------- 7
COLLECT
COLLECT — агрегатная фунция, принимает на вход колонку любого типа и создаёт nested table на выходе.
Для получения правильных результатов, должна использоваться вместе с функцией CAST.
SQL> select CAST(COLLECT(t.empno) AS test_number_table) as empno_collect from scott.emp t; EMPNO_COLLECT -------------------------------------------------------------------------------- TEST_NUMBER_TABLE(7369, 7499, 7521, 7566, 7654, 7698, 7782, 7788, 7839, 7844, 78 76, 7900, 7902, 7934, 8000)
POWERMULTISET
POWERMULTISET принимает на вход nested table и возвращает nested table of nested tables (вложенные таблицы вложеных таблиц) содержащие все непустые подмножества — все возможные комбинации из значений. POWERMULTISET нельзя использовать в PL/SQL.
SQL> select * from table(POWERMULTISET( test_number_table(1,2,3) ) ); COLUMN_VALUE -------------------------------------------------------------------------------- TEST_NUMBER_TABLE(1) TEST_NUMBER_TABLE(2) TEST_NUMBER_TABLE(1, 2) TEST_NUMBER_TABLE(3) TEST_NUMBER_TABLE(1, 3) TEST_NUMBER_TABLE(2, 3) TEST_NUMBER_TABLE(1, 2, 3) 7 rows selected.
POWERMULTISET_BY_CARDINALITY
POWERMULTISET_BY_CARDINALITY принимает на вход nested table и cardinality (количество элементов) и возвращает nested table of nested tables содержащие всевозможные комбинации значений с указаным количеством элементов.
SQL> select * from table(POWERMULTISET_BY_CARDINALITY( test_number_table(1,2,3) , 2) ); COLUMN_VALUE -------------------------------------------------------------------------------- TEST_NUMBER_TABLE(1, 2) TEST_NUMBER_TABLE(1, 3) TEST_NUMBER_TABLE(2, 3)
SET
SET удаляет дубликаты в наборе данных.
SQL> select * from table(set(test_number_table(1,2,3,4,5,1,2))); COLUMN_VALUE ------------ 1 2 3 4 5
Последние комментарии