Коллекции и записи Oracle PL/SQL

Коллекции и записи

Составной тип данных хранит значения, которые имеют внутренние компоненты. Вы можете передать целые составные переменные подпрограммам в качестве параметров, а также получить доступ к внутренним компонентам составных переменных по отдельности. Внутренние компоненты могут быть скалярными или составными. Вы можете использовать скалярные компоненты везде, где вы можете использовать скалярные переменные. PL/SQL позволяет вам определять два вида составных типов данных: коллекция и запись. Вы можете использовать составные компоненты везде, где вы можете использовать составные переменные одного типа.

Записи

RecordЗапись
%ROWTYPEМодификатор записи
%TYPEМодификатор столбца

Коллекции

Associative ArraysАссоциативные массивы
VarraysМассивы переменной длины
Nested TablesВложенные таблицы

Методы коллекций

Метод коллекции — это подпрограмма PL/SQL — либо функция, которая возвращает информацию о коллекции, либо процедура, которая работает с коллекцией. Методы сбора данных упрощают использование коллекций и упрощают поддержку ваших приложений.

С нулевой коллекцией EXISTS является единственным методом сбора, который не вызывает предопределенное исключение COLLECTION_IS_NULL.

Метод коллекцииТипОписание
DELETEПроцедураУдаляет элементы из коллекции.
TRIMПроцедураУдаляет элементы из конца varray или Nested Tables.
EXTENDПроцедураДобавляет элементы в конец varray или Nested Tables.
EXISTSФункцияВозвращает TRUE тогда и только тогда, когда существует определенный элемент varray или Nested Tables.
FIRST и LASTФункции FIRST возвращает первый, LAST последний индекс в коллекции.
COUNTФункцияВозвращает количество элементов в коллекции.
LIMITФункцияВозвращает максимальное количество элементов, которые может иметь коллекция.
PRIOR и NEXTФункции PRIOR возвращает индекс, который предшествует указанному индексу, NEXT возвращает индекс, который следует за указанным индексом.

Операции над коллекциями

MULTISET UNIONВозвращает объединение двух коллекций
MULTISET UNION DISTINCTВозвращает объединение двух коллекций с дистинктом (убирает дубли)
MULTISET INTERSECTВозвращает пересечение двух коллекций
MULTISET INTERSECT DISTINCTВозвращает пересечение двух коллекций с дистинктом (убирает дубли)
SETВозвращает коллекцию с дистинктом (т.е. коллекцию без дублей)
MULTISET EXCEPTВозвращает разницу (усечение) двух коллекций
MULTISET EXCEPT DISTINCTВозвращает разницу (усечение) двух коллекций с дистинктом (убирает дубли)

Исключительные ситуации коллекции.

В большинстве случаев, если вы ссылаетесь на несуществующий элемент коллекции, PL/SQL вызывает предопределенное исключение. Рассмотрим следующий пример:

  • В первом случае вложенная таблица атомарно равна NULL.
  • Во втором случае индекс равен NULL.
  • В третьем случае индекс находится за пределами допустимого диапазона.
  • В четвертом случае индекс превышает количество элементов в таблице.
  • В пятом случае индекс обозначает удаленный элемент.

Следующий список показывает, когда возникает данное исключение:

Исключение коллекцииКогда возникает
COLLECTION_IS_NULLвы пытаетесь оперировать с атомарно нулевой коллекцией.
NO_DATA_FOUNDобозначает элемент, который был удален, или несуществующий элемент ассоциативного массива.
SUBSCRIPT_BEYOND_COUNTиндекс превышает количество элементов в коллекции.
SUBSCRIPT_OUTSIDE_LIMITиндекс находится за пределами допустимого диапазона.
VALUE_ERRORиндекс не имеет значения или не может быть преобразован в тип ключа. Это исключение может возникнуть, если ключ определен как диапазон PLS_INTEGER, а индекс находится за пределами этого диапазона.

В некоторых случаях вы можете передавать недопустимые индексы в метод, не вызывая исключения. Например, когда вы передаете нулевой индекс процедуре DELETE, она ничего не делает. Кроме того, вы можете заменить удаленные элементы, без возникновения NO_DATA_FOUND, как показано в следующем примере:

Типы коллекций пакетов и локальные типы коллекций никогда не совместимы. Например, предположим, что вы хотите вызвать следующую процедуру пакета:

Когда вы запускаете нижеприведенный блок PL/SQL, второй вызов процедуры завершается неудачно с ошибочным номером или типом аргументов. Это связано с тем, что пакетные и локальные типы VARRAY несовместимы, даже если их определения идентичны.