Коллекции – это типы данных SQL, составляющие элементы которых представляют собой множественные элементы. Каждый элемент или значение для коллекции обладает тем же самым подстановочным типом данных. В Oracle предусмотрено два типа коллекций – массивы переменной длины (Varrays) и вложенные таблицы (Nested Tables).
Массив переменной длины содержит переменное число упорядоченных элементов. Типы данных VARRAY могут быть использованы для столбцов таблиц или атрибутов объектных типов.
С помощью Oracle SQL можно создавать указанные выше типы таблиц. Они могут использоваться как вложенные таблицы для реализации семантики неупорядоченной коллекции. Так же как и VARRAY, типы вложенных таблиц могут быть использованы для столбцов таблиц или атрибутов объектных типов.
Многоуровневые коллекции
СУБД Oracle9i поддерживает множественные уровни вложенности коллекций, например, вложенные таблицы или массивы переменной длины, встроенные в некоторую вложенную таблицу или массив переменной длины. В Oracle Common Schema есть отличный пример, показывающий преимущества поддержки многоуровневых коллекций. В UML-диаграмме на рис. 1, класс Customer показан как имеющий агрегат класса Order, который, в свою очередь, имеет агрегат класса Order_Item. Следующий пример показывает, как отобразить эти конструкции, создавая тип customer_typ, который содержит коллекцию вложенных таблиц типа order_typ, который, в свою очередь, включает коллекцию вложенных таблиц типа order_item_typ.
create type order_item_typ as object ( order_id number(12) , line_item_id number(3) , unit_price number(8,2) , quantity number(8) , product_ref REF product_information_typ ) ; create type order_item_list_typ as table of order_item_typ; create type customer_typ; create type order_typ as object ( order_id number(12) , order_mode varchar2(8) , customer_ref REF customer_typ , order_status number(2) , order_total number(8,2) , sales_rep_id number(6) , order_item_list order_item_list_typ ) ; create type order_list_typ as table of order_typ; create or replace type customer_typ as object ( customer_id number(6) , cust_first_name varchar2(20) , cust_last_name varchar2(20) , cust_address cust_address_typ , phone_numbers phone_list_typ , nls_language varchar2(3) , nls_territory varchar2(30) , credit_limit number(9,2) , cust_email varchar2(30) , cust_orders order_list_typ );
В том же самом примере из Oracle Common Schema создается объектное представление для многоуровневых коллекций.
create or replace view oc_customers of customer_typ with object oid (customer_id) as select c.customer_id, c.cust_first_name, c.cust_last_name, c.cust_address, c.phone_numbers,c.nls_language, c.nls_territory,c.credit_limit, c.cust_email, cast(multiset(select o.order_id, o.order_mode, make_ref(oc_customers,o.customer_id), o.order_status, o.order_total,o.sales_rep_id, cast(multiset(select l.order_id,l.line_item_id, l.unit_price,l.quantity, make_ref(oc_product_information, l.product_id) from order_items l where o.order_id = l.order_id) as order_item_list_typ) from orders o where c.customer_id = o.customer_id) as order_list_typ) from customers c;