Все про колекціях в oracle

Колекції присутній в тому чи іншому вигляді в більшості мов програмування і скрізь мають схожу суть в плані використання. А саме - дозволяють зберігати набір об'єктів одного типу і проводити над усім набором будь-які дії, або в циклі проводити однотипні дії з усіма елементами набору.

Таким же чином колекції використовуються і в Oracle.

Загальні відомості про колекції в pl / sql
  • Створення колекції відбувається в два етапи
    1. Спочатку ми оголошуємо тип (type) колекції (конструкції assoc_array_type_def, varray_type_def і nested_table_type_def будуть наведені далі)
  • Потім оголошуємо змінну цього типу
  • Звернення до елементу колекції має наступний синтаксис:
  • Змінні типу колекції можуть приймати значення NULL (і самі елементи колекцій теж).
  • Можливі багатовимірні колекції (колекції колекцій)
  • типи колекцій

    PL / SQL block
    Package
    Schema level

    Тільки певні на рівні схеми

    асоціативний масив

    Також його називають index by table або pl / sql table.
    Тип описується наступним чином (assoc_array_type_def) :.

    Все про колекціях в oracle

    • Для приміщення в пам'ять невеликих таблиць-довідників
    • Для передачі в якості параметра колекції

    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):

    • Розмір колекції змінюється динамічно
    • Може бути в розрядженому стані, як показано на зображенні
      <
      Все про колекціях в oracle
    • ініціалізується конструктором
    • Якщо параметри в конструктор не передаються, повертається порожня колекція
    • 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 не використовуватиме збережені за колекцією осередки пам'яті, а додасть новий елемент (виділить нову пам'ять)