Коллекции Oracle PL / SQL: Varrays, Nested & Указатель по таблицам

Содержание:

Anonim

Что такое коллекция?

Коллекция - это упорядоченная группа элементов определенных типов данных. Это может быть набор простого типа данных или сложного типа данных (например, определяемых пользователем типов или типов записей).

В коллекции каждый элемент идентифицируется термином, называемым «нижний индекс». Каждому элементу в коллекции присваивается уникальный индекс. Данные в этой коллекции можно манипулировать или извлекать, обращаясь к этому уникальному индексу.

Коллекции являются наиболее полезными вещами, когда необходимо обрабатывать или обрабатывать большие данные одного типа. Коллекции можно заполнять и манипулировать ими как единое целое, используя опцию «BULK» в Oracle.

В этом руководстве вы узнаете:

  • Что такое коллекция?
  • Varrays
  • Вложенные таблицы
  • Индекс за таблицей
  • Конструктор и концепция инициализации в коллекциях
  • Методы сбора

Коллекции классифицируются на основе структуры, индекса и хранилища, как показано ниже.

  • Индекс по таблицам (также известный как ассоциативный массив)
  • Вложенные таблицы
  • Varrays

В любой момент данные в коллекции могут упоминаться с помощью трех терминов «Имя коллекции», «Подстрочный индекс», «Поле / имя столбца» как « (). ». Вы узнаете об этих вышеупомянутых категориях коллекций далее в разделе ниже.

Varrays

Varray - это метод сбора, в котором размер массива фиксирован. Размер массива не может быть больше его фиксированного значения. Нижний индекс Варрея имеет числовое значение. Ниже приведены атрибуты Варреев.

  • Размер верхнего предела фиксирован
  • Заполняется последовательно, начиная с нижнего индекса «1».
  • Этот тип коллекции всегда плотный, т.е. мы не можем удалить какие-либо элементы массива. Варрей можно удалить целиком, а можно обрезать с конца.
  • Поскольку он всегда плотный по своей природе, он имеет очень меньшую гибкость.
  • Более целесообразно использовать, когда размер массива известен, и выполнять аналогичные действия со всеми элементами массива.
  • Нижний индекс и последовательность всегда остаются стабильными, т. Е. Нижний индекс и счет коллекции всегда одинаковы.
  • Их необходимо инициализировать перед использованием в программах. Любая операция (кроме операции EXISTS) с неинициализированной коллекцией вызовет ошибку.
  • Он может быть создан как объект базы данных, который виден во всей базе данных или внутри подпрограммы, которая может использоваться только в этой подпрограмме.

На приведенном ниже рисунке схематично объясняется распределение памяти Варреем (плотным).

Нижний индекс 1 2 3 4 5 6 7
Ценить Xyz Dfv Sde Cxs Vbc Нху Qwe

Синтаксис для VARRAY:

TYPE  IS VARRAY () OF ;
  • В приведенном выше синтаксисе type_name объявлен как VARRAY типа DATA_TYPE для заданного ограничения размера. Тип данных может быть простым или сложным.

Вложенные таблицы

Вложенная таблица - это коллекция, в которой размер массива не фиксирован. Он имеет числовой индексный тип. Ниже приведены дополнительные описания вложенных таблиц.

  • Вложенная таблица не имеет верхнего предела размера.
  • Поскольку верхний предел размера не фиксирован, память коллекции необходимо расширять каждый раз перед ее использованием. Мы можем расширить коллекцию с помощью ключевого слова EXTEND.
  • Заполняется последовательно, начиная с нижнего индекса «1».
  • Этот тип коллекции может быть как плотной, так и разреженной , то есть мы можем создать коллекцию как плотную, и мы также можем случайным образом удалить отдельный элемент массива, что сделает его разреженным.
  • Это дает больше гибкости при удалении элемента массива.
  • Он хранится в таблице базы данных, созданной системой, и может использоваться в запросе выбора для получения значений.
  • Нижний индекс и последовательность нестабильны, т. Е. Нижний индекс и количество элементов массива могут изменяться.
  • Их необходимо инициализировать перед использованием в программах. Любая операция (кроме операции EXISTS) над неинициализированной коллекцией вызовет ошибку.
  • Он может быть создан как объект базы данных, который виден во всей базе данных или внутри подпрограммы, которая может использоваться только в этой подпрограмме.

На приведенном ниже рисунке схематически объясняется распределение памяти вложенной таблицы (плотной и разреженной). Черное пространство элементов обозначает пустой элемент в коллекции, т.е. разреженный.

Нижний индекс 1 2 3 4 5 6 7
Значение (плотное) Xyz Dfv Sde Cxs Vbc Нху Qwe
Значение (разреженное) Qwe Asd Афг Asd Wer

Синтаксис вложенной таблицы:

TYPE  IS TABLE OF ;
  • В приведенном выше синтаксисе type_name объявлен как коллекция вложенных таблиц типа DATA_TYPE. Тип данных может быть простым или сложным.

Индекс за таблицей

Индекс за таблицей - это коллекция, в которой размер массива не фиксирован. В отличие от других типов коллекций, в коллекции индексов за таблицей нижний индекс может быть определен пользователем. Ниже приведены атрибуты индекса за таблицей.

  • Нижний индекс может быть целым или строковым. При создании коллекции следует указать тип индекса.
  • Эти коллекции не хранятся последовательно.
  • Они всегда редки по своей природе.
  • Размер массива не фиксирован.
  • Их нельзя сохранить в столбце базы данных. Они должны быть созданы и использованы в любой программе в этом конкретном сеансе.
  • Они дают больше гибкости с точки зрения сохранения подстрочного индекса.
  • Индексы также могут иметь отрицательную последовательность индексов.
  • Они более подходят для использования для относительно небольших коллективных значений, в которых коллекция может быть инициализирована и использована в рамках одних и тех же подпрограмм.
  • Их не нужно инициализировать перед началом использования.
  • Его нельзя создать как объект базы данных. Его можно создать только внутри подпрограммы, которую можно использовать только в этой подпрограмме.
  • BULK COLLECT нельзя использовать в этом типе коллекции, так как индекс должен быть указан явно для каждой записи в коллекции.

На приведенном ниже рисунке схематично объясняется распределение памяти вложенной таблицы (разреженной). Черное пространство элементов обозначает пустой элемент в коллекции, т.е. разреженный.

Подстрочный индекс (varchar) ПЕРВЫЙ ВТОРОЙ В ТРЕТЬИХ ЧЕТВЕРТАЯ ПЯТАЯ ШЕСТОЙ СЕДЬМОЙ
Значение (разреженное) Qwe Asd Афг Asd Wer

Синтаксис для индекса за таблицей

TYPE  IS TABLE OF  INDEX BY VARCHAR2 (10);
  • В приведенном выше синтаксисе type_name объявлен как коллекция индексов за таблицей типа DATA_TYPE. Тип данных может быть простым или сложным. Переменная subsciprt / index задается как тип VARCHAR2 с максимальным размером 10.

Конструктор и концепция инициализации в коллекциях

Конструкторы - это встроенная функция, предоставляемая оракулом, которая имеет то же имя, что и объект или коллекции. Они выполняются первыми, когда объект или коллекции впервые упоминаются в сеансе. Ниже приведены важные детали конструктора в контексте коллекции:

  • Для коллекций эти конструкторы должны вызываться явно для их инициализации.
  • Таблицы Varray и Nested должны быть инициализированы с помощью этих конструкторов, прежде чем они попадут в программу.
  • Конструктор неявно расширяет выделение памяти для коллекции (кроме Varray), поэтому конструктор также может назначать переменные коллекциям.
  • Присвоение значений коллекции с помощью конструкторов никогда не сделает коллекцию разреженной.

Методы сбора

Oracle предоставляет множество функций для управления коллекциями и работы с ними. Эти функции очень полезны в программе для определения и изменения различных атрибутов коллекций. В следующей таблице приведены различные функции и их описание.

Методика Описание СИНТАКСИС
СУЩЕСТВУЕТ (n) Этот метод вернет логические результаты. Он вернет «ИСТИНА», если n- й элемент существует в этой коллекции, иначе он вернет ЛОЖЬ. В неинициализированной коллекции можно использовать только функции EXISTS. <имя_сборки> .EXISTS (позиция_элемента)
СЧИТАТЬ Дает общее количество элементов, присутствующих в коллекции <имя_сборки> .COUNT
LIMIT Возвращает максимальный размер коллекции. Для Varray он вернет фиксированный размер, который был определен. Для вложенной таблицы и индекса за таблицей он дает NULL <имя_сборки> .LIMIT
ПЕРВЫЙ Возвращает значение первой индексной переменной (нижнего индекса) коллекций. <имя_сборки> .FIRST
ПОСЛЕДНИЙ Возвращает значение последней индексной переменной (нижнего индекса) коллекций. <имя_сборки> .LAST
ПРИОР (n) Возвращает перед индексной переменной в коллекции n- го элемента. Если нет предшествующего значения индекса, возвращается NULL <имя_сборки> .PRIOR (n)
СЛЕДУЮЩИЙ (n) Успешно возвращает индексную переменную в коллекции n- го элемента. Если нет успешных результатов, возвращается значение индекса NULL <имя_сборки> .NEXT (n)
ПРОДЛЕВАТЬ Расширяет один элемент в коллекции в конце <имя_сборки> .EXTEND
РАСШИРЯТЬ (n) Расширяет n элементов в конце коллекции <имя_сборки> .EXTEND (n)
РАСШИРЯТЬ (n, i) Расширяет n копий i- го элемента в конце коллекции <имя_сборки> .EXTEND (n, i)
ПОДРЕЗАТЬ Удаляет один элемент из конца коллекции <имя_сборки> .TRIM
ОБРЕЗАТЬ (n) Удаляет n элементов из конца коллекции <имя_сборки> .TRIM (n)
УДАЛИТЬ Удаляет все элементы из коллекции. Делает коллекцию пустой <имя_сборки> .DELETE
УДАЛИТЬ (n) Удаляет n-й элемент из коллекции. Если n- й элемент равен NULL, это ничего не сделает <имя_сборки> .DELETE (n)
УДАЛИТЬ (m, n) Удаляет элемент в диапазоне от m- го до n- го в коллекции. <имя_сборки> .DELETE (m, n)

Пример 1: Тип записи на уровне подпрограммы

В этом примере мы увидим, как заполнить коллекцию с помощью BULK COLLECT и как ссылаться на данные коллекции.

DECLARETYPE emp_det IS RECORD(EMP_NO NUMBER,EMP_NAME VARCHAR2(150),MANAGER NUMBER,SALARY NUMBER);TYPE emp_det_tbl IS TABLE OF emp_det; guru99_emp_rec emp_det_tbl:= emp_det_tbl();BEGININSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1000,’AAA’,25000,1000);INSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1001,'XXX’,10000,1000);INSERT INTO emp (emp_no, emp_name, salary, manager) VALUES (1002,'YYY',15000,1000);INSERT INTO emp (emp_no,emp_name,salary, manager) VALUES (1003,’ZZZ’,'7500,1000);COMMIT:SELECT emp no,emp_name,manager,salary BULK COLLECT INTO guru99_emp_recFROM emp;dbms_output.put_line (‘Employee Detail');FOR i IN guru99_emp_rec.FIRST… guru99_emp_rec.LASTLOOPdbms_output.put_line (‘Employee Number: '||guru99_emp_rec(i).emp_no);dbms_output.put_line (‘Employee Name: '||guru99_emp_rec(i).emp_name);dbms_output.put_line (‘Employee Salary:'|| guru99_emp_rec(i).salary);dbms_output.put_line(‘Employee Manager Number:'||guru99_emp_rec(i).manager);dbms_output.put_line('--------------------------------');END LOOP;END;/

Пояснение к коду:

  • Строка кода 2-8 : Тип записи emp_det объявлен со столбцами emp_no, emp_name, salary и manager с типом данных NUMBER, VARCHAR2, NUMBER, NUMBER.
  • Строка кода 9: Создание коллекции emp_det_tbl элемента типа записи emp_det
  • Строка кода 10: Объявление переменной guru99_emp_rec как типа emp_det_tbl и инициализация нулевым конструктором.
  • Строка кода 12-15: Вставка данных примера в таблицу emp.
  • Строка кода 16: Подтверждение вставки транзакции.
  • Строка кода 17: выборка записей из таблицы 'emp' и заполнение переменной коллекции в виде большого количества с помощью команды «BULK COLLECT». Теперь переменная guru99_emp_rec содержит все записи, которые присутствуют в таблице emp.
  • Строка кода 19-26: Установка цикла FOR с использованием для печати всех записей в коллекции одну за другой. Метод сбора FIRST и LAST используется как нижний и верхний предел цикла.

Вывод : как вы можете видеть на скриншоте выше, когда приведенный выше код будет выполнен, вы получите следующий результат

Employee DetailEmployee Number: 1000Employee Name: AAAEmployee Salary: 25000Employee Manager Number: 1000----------------------------------------------Employee Number: 1001Employee Name: XXXEmployee Salary: 10000Employee Manager Number: 1000----------------------------------------------Employee Number: 1002Employee Name: YYYEmployee Salary: 15000Employee Manager Number: 1000----------------------------------------------Employee Number: 1003Employee Name: ZZZEmployee Salary: 7500Employee Manager Number: 1000----------------------------------------------