Коллекции и записи
Методы, применяемые при работе с коллекциями
В PL/SQL реализован ряд встроенных методов для работы с коллекциями. Эти методы вызываются как
collection_name.method_name[(parameters)]
Эти методы нельзя вызывать из SQL-оператора.
В следующей таблице приведено описание встроенных функций, используемых для работы с коллекциями.
Применение функций TRIM и EXTEND реализует для вложенных таблиц механизм стека, позволяя удалять элементы и добавлять их в конец вложенной таблицы. Функция DELETE выполняет удаление элементов, оставляя пустые места, которые впоследствии учитываются функцией TRIM.
Значение, возвращаемое функцией COUNT, может использоваться как максимальное значение для счетчика цикла по элементам коллекции.
Например:
FOR i IN 1..tbl1.COUNT LOOP END LOOP;
Функция COUNT также позволяет определить количество строк, которые были извлечены из столбца базы данных во вложенную таблицу.
Для Varray-массивов значение, возвращаемое функцией COUNT, эквивалентно значению, возвращаемому функцией LAST. Для вложенных таблиц эти значения могут быть различны в том случае, если выполнялась процедура DELETE, удаляющая элементы из коллекции.
Перед тем как коллекция будет проинициализирована, можно использовать только метод EXISTS. При вызове любого другого встроенного метода будет инициировано исключение.
Например:
DECLARE - Вложенная таблица TYPE cl IS TABLE OF VARCHAR2(10); c1 cl; BEGIN - Инициализации - коллекции конструктором c1 := cl('с 1', 'с 2', 'с 3'); - Удаление последнего (3-го) элемента c1.DELETE(c1.LAST); - Удаление двух последних элементов: - (2-го и 3-го) c1.TRIM(c1.COUNT); - Запись в поток - вывода значения 'с 1' DBMS_OUTPUT.PUT_LINE(c1(1)); END;
Если при работе с коллекцией происходит ошибка, то Oracle инициирует бросок исключения. В следующей таблице приведены основные причины возникновения ошибок для коллекций.
Исключение | Причина ошибки |
---|---|
COLLECTION_IS_NULL | Коллекция не была инициализирована |
NO_DATA_FOUND | Индекс ссылается на ранее удаленный элемент коллекции |
SUBSCRIPT_BEYOND_COUNT | Индекс больше, чем количество элементов в коллекции |
SUBSCRIPT_OUTSIDE_LIMIT | Индекс не принадлежит допустимому диапазону значений индекса |
VALUE_ERROR | Значение индекса равно NULL или не может быть преобразовано в целое |
Исключительная ситуация не инициируется, если для процедуры DELETE в качестве параметра передан индекс, равный NULL, а также при указании индекса ранее удаленного элемента в случае его замещения.