Московский государственный университет имени М.В.Ломоносова
Опубликован: 05.01.2004 | Доступ: свободный | Студентов: 9474 / 1246 | Оценка: 4.04 / 3.84 | Длительность: 10:03:00
ISBN: 978-5-94774-539-9
Лекция 12:

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

< Лекция 11 || Лекция 12: 123 || Лекция 13 >

Методы, применяемые при работе с коллекциями

В PL/SQL реализован ряд встроенных методов для работы с коллекциями. Эти методы вызываются как

collection_name.method_name[(parameters)]

Эти методы нельзя вызывать из SQL-оператора.

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

Метод Описание
EXISTS(n) Если n -ый элемент коллекции существует, то функция возвращает значение TRUE
COUNT Функция возвращает реальное количество элементов, которые содержит коллекция
LIMIT Функция возвращает размер varray-массива или NULL - для вложенных таблиц
DELETE(m,n) Эта процедура удаляет элементы из вложенной или индексированной таблицы. Если параметров не задано, то удаляются все элементы коллекции. При задании параметра n удаляется n -ый элемент вложенной таблицы, а если задано оба параметра, то удаляются все элементы в диапазоне от n до m
FIRST, LAST Функции возвращают наименьший и наибольший индекс элементов коллекции. Для пустой вложенной таблицы обе функции возвращают значение NULL. Для Varray-массивов вызов функции FIRST всегда возвращает значение 1
PRIOR(n) Эта функция используется для цикла или последовательного просмотра элементов вложенных таблиц и возвращает индекс элемента, предшествующего указанному параметром n. Если такого элемента нет, то возвращается значение NULL
NEXT(n) Функция употребляется для цикла или последовательного просмотра элементов вложенных таблиц и возвращает индекс элемента, следующего за указанным параметром n. Если такого элемента нет, то возвращается значение NULL
EXTEND(n,i) Функция увеличивает размер вложенной или индексированной таблицы, позволяя добавлять в конец коллекции как один элемент, так и несколько элементов. Если параметров не задано, то в коллекцию добавляется один null -элемент, а если указан только параметр n, то добавляются n null -элементов. Если задано оба параметра, то добавляются n элементов, являющихся копиями i -го элемента коллекции
TRIM(n) Функция выполняет удаление одного или нескольких элементов вложенной или индексированной таблицы. Если параметры не указаны, то удаляется один последний элемент, а при задании параметра удаляются n последних элементов коллекции. Если значение параметра превышает реальное количество элементов, возвращаемое функцией COUNT, то инициируется исключение. Если элемент был ранее удален функцией DELETE, то он все равно будет входить в число удаляемых функцией TRIM элементов

Применение функций 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, а также при указании индекса ранее удаленного элемента в случае его замещения.

< Лекция 11 || Лекция 12: 123 || Лекция 13 >