Колекції присутній в тому чи іншому вигляді в більшості мов програмування і скрізь мають схожу суть в плані використання. А саме - дозволяють зберігати набір об'єктів одного типу і проводити над усім набором будь-які дії, або в циклі проводити однотипні дії з усіма елементами набору.
Таким же чином колекції використовуються і в Oracle.
Загальні відомості про колекції в pl / sql
- Створення колекції відбувається в два етапи
- Спочатку ми оголошуємо тип (type) колекції (конструкції assoc_array_type_def, varray_type_def і nested_table_type_def будуть наведені далі)
типи колекцій
PL / SQL block
Package
Schema level
Тільки певні на рівні схеми
асоціативний масив
Також його називають index by table або pl / sql table.
Тип описується наступним чином (assoc_array_type_def) :.
- Для приміщення в пам'ять невеликих таблиць-довідників
- Для передачі в якості параметра колекції
Restrictions:
При зміні параметрів NLS_SORT і NLS_COMP під час сесії після заповнення асоціативного масиву, можемо отримувати несподівані результати викликів методів first, last, next, previous. Також можуть виникнути проблеми при передачі асоціативного масиву в якості параметра на іншу БД з іншими настройками NLS_SORT і NLS_COMP
Являє собою масив послідовно зберігаються елементів
Тип описується наступним чином (varay_type_def):
- Розмір задається при створенні
- Індексується з 1
- ініціалізується конструктором
- Якщо параметри в конструктор не передаються, повертається порожня колекція
- Datatype - це будь-який тип даних, крім ref cursor
- Знаємо максимально можливу кількість елементів
- Доступ до елементів послідовний
Restrictions:
Максимальний розмір - 2 147 483 647 елементів
Nested table
Тип описується наступним чином (nested_table_type_def):
- Розмір колекції змінюється динамічно
- Може бути в розрядженому стані, як показано на зображенні
< - ініціалізується конструктором
- Якщо параметри в конструктор не передаються, повертається порожня колекція
- Datatype - це будь-який тип даних, крім ref cursor
- Якщо містить тільки одне скалярне значення, то ім'я колонки - Column_Value
- Якщо параметри в конструктор не передаються, повертається порожня колекція
Set operations з nested tables
Операції можливі тільки з колекціями nested table. Обидві колекції, які беруть участь в операції, повинні бути одного типу.
Результатом операції також є колекція nested table.
- Delete видаляє всі елементи. Відразу ж очищає пам'ять, виділену для зберігання цих елементів.
- Delete (n) видаляє елемент з індексом n. Пам'ять не звільняє. Елемент можна відновити (тобто задати новий) і він займе ту ж пам'ять, що займав попередній.
- Delete (n, m) видаляє елементи з індексами в проміжку n..m
- Якщо видаляється елемента в колекції немає, нічого не робить.
- Trim () - видаляє один елемент в кінці колекції. Якщо елемента немає, генерує виняток SUBSCRIPT_BEYOND_COUNT
- Trim (n) - видаляє n елементів в кінці колекції. Якщо елементів менше, ніж n, генерується виключення SUBSCRIPT_BEYOND_COUNT
- Працює з внутрішнім розміром колекції. Тобто якщо останній елемент був вилучений за допомогою Delete, виклик Trim () видалить вже віддалений раніше елемент.
- Відразу очищає пам'ять, виділену для зберігання цих елементів
- Краще не використовувати в поєднанні з Delete ()
- EXTEND додає один елемент зі значенням null в кінець колекції
- EXTEND (n) додає n елементів зі значенням null в кінець колекції
- EXTEND (n, i) додає n копій елемента з індексом i в кінець колекції. Якщо колекція має NOT NULL констрейнтів, тільки цією формою можна користуватися.
- Якщо елементи були раніше вилучені за допомогою методу Delete, Extend не використовуватиме збережені за колекцією осередки пам'яті, а додасть новий елемент (виділить нову пам'ять)