Как и следовало бы ожидать от СУБД Oracle, плотная, а не поверхностная работа с коллекциями в качестве средства моделирования групп объектов требует знания большого числа "деталей". Здесь не место разъяснять их все, но одну важную для коллекций возможность стоит привести. Имеется в виду разворачивание коллекции в список строк, столь привычный для традиционной работы.
Для того, чтобы посмотреть список сотрудников отдела 'Operations' в более привычном виде, следует воспользоваться специальной функцией TABLE:
SELECT * FROM TABLE(SELECT emps FROM department);
К аргументу функции TABLE (это вложенный SELECT) есть одна настоятельная просьба: возвращать одну и только коллекцию. Наши данные это обеспечивают, а иначе вложенный SELECT нужно было бы подправить.
Аналогичный пример для массива VARRAY:
SELECT ename FROM TABLE(SELECT emps FROM department1);
Замечательно, что это преобразование решает задачу и изменения списка средствами SQL:
INSERT INTO TABLE(SELECT emps FROM department)
VALUES ('Allen', 'Salesman');
SELECT * FROM TABLE(SELECT emps FROM department);
(Эта возможность не сработает, однако, для массива VARRAY, который в БД ведет себя, по сути, как скаляр, допуская изменение поля-списка как единого, уже сформированного целого). Если бы возможность такого преобразования отсутствовала, добавить сотрудника в отдел или удалить можно было бы только программным способом, проще всего в PL/SQL.
Естественно, никто не мешает осуществить и массовую вставку:
INSERT INTO TABLE(SELECT emps FROM department)
SELECT ename, job FROM emp;
Для обратного преобразования, из таблицы в коллекцию, потребуется более сложная конструкция:
SELECT
CAST (MULTISET(SELECT ename, job FROM emp) AS employee_nlist_typ)
FROM DUAL;
Однако такое преобразование на практике менее востребовано.