Что такое коллекция?
Коллекция - это упорядоченная группа элементов определенных типов данных. Это может быть набор простого типа данных или сложного типа данных (например, определяемых пользователем типов или типов записей).
В коллекции каждый элемент идентифицируется термином, называемым «нижний индекс». Каждому элементу в коллекции присваивается уникальный индекс. Данные в этой коллекции можно манипулировать или извлекать, обращаясь к этому уникальному индексу.
Коллекции являются наиболее полезными вещами, когда необходимо обрабатывать или обрабатывать большие данные одного типа. Коллекции можно заполнять и манипулировать ими как единое целое, используя опцию «BULK» в Oracle.
В этом руководстве вы узнаете:
- Что такое коллекция?
- Varrays
- Вложенные таблицы
- Индекс за таблицей
- Конструктор и концепция инициализации в коллекциях
- Методы сбора
Коллекции классифицируются на основе структуры, индекса и хранилища, как показано ниже.
- Индекс по таблицам (также известный как ассоциативный массив)
- Вложенные таблицы
- Varrays
В любой момент данные в коллекции могут упоминаться с помощью трех терминов «Имя коллекции», «Подстрочный индекс», «Поле / имя столбца» как «
Varrays
Varray - это метод сбора, в котором размер массива фиксирован. Размер массива не может быть больше его фиксированного значения. Нижний индекс Варрея имеет числовое значение. Ниже приведены атрибуты Варреев.
- Размер верхнего предела фиксирован
- Заполняется последовательно, начиная с нижнего индекса «1».
- Этот тип коллекции всегда плотный, т.е. мы не можем удалить какие-либо элементы массива. Варрей можно удалить целиком, а можно обрезать с конца.
- Поскольку он всегда плотный по своей природе, он имеет очень меньшую гибкость.
- Более целесообразно использовать, когда размер массива известен, и выполнять аналогичные действия со всеми элементами массива.
- Нижний индекс и последовательность всегда остаются стабильными, т. Е. Нижний индекс и счет коллекции всегда одинаковы.
- Их необходимо инициализировать перед использованием в программах. Любая операция (кроме операции EXISTS) с неинициализированной коллекцией вызовет ошибку.
- Он может быть создан как объект базы данных, который виден во всей базе данных или внутри подпрограммы, которая может использоваться только в этой подпрограмме.
На приведенном ниже рисунке схематично объясняется распределение памяти Варреем (плотным).
Нижний индекс | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Ценить | Xyz | Dfv | Sde | Cxs | Vbc | Нху | Qwe |
Синтаксис для VARRAY:
TYPEIS 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 |
Синтаксис вложенной таблицы:
TYPEIS TABLE OF ;
- В приведенном выше синтаксисе type_name объявлен как коллекция вложенных таблиц типа DATA_TYPE. Тип данных может быть простым или сложным.
Индекс за таблицей
Индекс за таблицей - это коллекция, в которой размер массива не фиксирован. В отличие от других типов коллекций, в коллекции индексов за таблицей нижний индекс может быть определен пользователем. Ниже приведены атрибуты индекса за таблицей.
- Нижний индекс может быть целым или строковым. При создании коллекции следует указать тип индекса.
- Эти коллекции не хранятся последовательно.
- Они всегда редки по своей природе.
- Размер массива не фиксирован.
- Их нельзя сохранить в столбце базы данных. Они должны быть созданы и использованы в любой программе в этом конкретном сеансе.
- Они дают больше гибкости с точки зрения сохранения подстрочного индекса.
- Индексы также могут иметь отрицательную последовательность индексов.
- Они более подходят для использования для относительно небольших коллективных значений, в которых коллекция может быть инициализирована и использована в рамках одних и тех же подпрограмм.
- Их не нужно инициализировать перед началом использования.
- Его нельзя создать как объект базы данных. Его можно создать только внутри подпрограммы, которую можно использовать только в этой подпрограмме.
- BULK COLLECT нельзя использовать в этом типе коллекции, так как индекс должен быть указан явно для каждой записи в коллекции.
На приведенном ниже рисунке схематично объясняется распределение памяти вложенной таблицы (разреженной). Черное пространство элементов обозначает пустой элемент в коллекции, т.е. разреженный.
Подстрочный индекс (varchar) | ПЕРВЫЙ | ВТОРОЙ | В ТРЕТЬИХ | ЧЕТВЕРТАЯ | ПЯТАЯ | ШЕСТОЙ | СЕДЬМОЙ |
Значение (разреженное) | Qwe | Asd | Афг | Asd | Wer |
Синтаксис для индекса за таблицей
TYPEIS 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----------------------------------------------