В этом учебном материале вы узнаете, как использовать методы коллекций PRIOR и NEXT в Oracle PL/SQL с синтаксисом и примерами.
Описание
В Oracle PL/SQL методы PRIOR и NEXT - это функции, которые позволяют перемещаться назад и вперед в коллекции (игнорируя удаленные элементы, даже если DELETE хранит для них заполнители). Эти методы полезны для пересечения редких коллекций.
Учитывая индекс:
PRIOR возвращает индекс предыдущего существующего элемента коллекции, если таковой существует. В противном случае PRIOR возвращает NULL.
Для любой коллекции c, c.PRIOR (c.FIRST) возвращает NULL.
NEXT возвращает индекс последующего существующего элемента коллекции, если таковой существует. В противном случае NEXT возвращает NULL.
Для любой коллекции c, c.NEXT (c.LAST) возвращает NULL.
Данный индекс не обязательно должен существовать. Однако если коллекция является Varray, то индекс не может превышать LIMIT.
Синтаксис
Синтаксис методов коллекций PRIOR и NEXT в Oracle PL/SQL.
collection_name.NEXT;
Параметры или аргументы
collection_name - наименование коллекции.
PRIOR - предыдущий существующий элемент коллекции.
NEXT - последующий существующий элемент коллекции.
Примечание
Пример
Рассмотрим пример, чтобы понять как использовать методы коллекций PRIOR и NEXT в Oracle PL/SQL.
Пример, который инициализирует Nested Table шестью элементами, удаляет четвертый элемент и затем показывает значения PRIOR и NEXT для элементов с 1 по 7. Элементы 4 и 7 не существуют. Элемент 2 существует, несмотря на его нулевое значение.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
DECLARE TYPE nt_type IS TABLE OF NUMBER; nt nt_type := nt_type(18, NULL, 36, 45, 54, 63); BEGIN nt.DELETE(4); DBMS_OUTPUT.PUT_LINE('nt(4) was deleted.'); FOR i IN 1..7 LOOP DBMS_OUTPUT.PUT('nt.PRIOR(' || i || ') = '); print(nt.PRIOR(i)); DBMS_OUTPUT.PUT('nt.NEXT(' || i || ') = '); print(nt.NEXT(i)); END LOOP; END; Результат: nt(4) was deleted. nt.PRIOR(1) = NULL nt.NEXT(1) = 2 nt.PRIOR(2) = 1 nt.NEXT(2) = 3 nt.PRIOR(3) = 2 nt.NEXT(3) = 5 nt.PRIOR(4) = 3 nt.NEXT(4) = 5 nt.PRIOR(5) = 3 nt.NEXT(5) = 6 nt.PRIOR(6) = 5 nt.NEXT(6) = NULL nt.PRIOR(7) = 6 nt.NEXT(7) = NULL |
Для Associative Array (ассоциативного массива), индексированного строкой, предыдущий и следующий индексы определяются значениями ключа, которые находятся в отсортированном порядке. В примере ниже используются FIRST, NEXT и цикл WHILE LOOP для печати элементов Associative Array.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
DECLARE TYPE NumList IS TABLE OF NUMBER; n NumList := NumList(1, 2, NULL, NULL, 5, NULL, 7, 8, 9, NULL); subscript INTEGER; BEGIN DBMS_OUTPUT.PUT_LINE('First to last:'); subscript := n.FIRST; WHILE subscript IS NOT NULL LOOP DBMS_OUTPUT.PUT('n(' || subscript || ') = '); print(n(subscript)); subscript := n.NEXT(subscript); END LOOP; DBMS_OUTPUT.PUT_LINE('--------------'); DBMS_OUTPUT.PUT_LINE('Last to first:'); subscript := n.LAST; WHILE subscript IS NOT NULL LOOP DBMS_OUTPUT.PUT('n(' || subscript || ') = '); print(n(subscript)); subscript := n.PRIOR(subscript); END LOOP; END; Результат: First to last: n(1) = 1 n(2) = 2 n(3) = NULL n(4) = NULL n(5) = 5 n(6) = NULL n(7) = 7 n(8) = 8 n(9) = 9 n(10) = NULL -------------- Last to first: n(10) = NULL n(9) = 9 n(8) = 8 n(7) = 7 n(6) = NULL n(5) = 5 n(4) = NULL n(3) = NULL n(2) = 2 n(1) = 1 |
Приведенный пример печатает элементы неограниченной Nested Table от первого до последнего, используя FIRST и NEXT, и от последнего до первого, используя LAST и PRIOR.