т, как использовать методы коллекций FIRST и LAST в Oracle PL/SQL с синтаксисом и примерами.
Описание
В Oracle PL/SQL методы FIRST и LAST - это функции. Если в коллекции есть хотя бы один элемент, FIRST и LAST возвращают индексы первого и последнего элементов соответственно (игнорируя удаленные элементы, даже если DELETE хранит для них заполнители). Если коллекция имеет только один элемент, FIRST и LAST возвращают один и тот же индекс. Если коллекция пуста, FIRST и LAST возвращают NULL.
Синтаксис
Синтаксис методов коллекций FIRST и LAST в Oracle PL/SQL.
collection_name.LAST;
Параметры или аргументы
collection_name - типы коллекции.
FIRST - индекс первого элемента коллекции.
LAST - индекс последнего элемента коллекции.
Примечание
Пример
Рассмотрим некоторые примеры, чтобы понять как использовать методы коллекций FIRST и LAST в Oracle PL/SQL.
- Примеры методов FIRST и LAST для Associative Arrays
- Примеры методов FIRST и LAST методы для Varray
- Пример методов FIRST и LAST методы для Nested Tables
Примеры методов FIRST и LAST для Associative Arrays
Для Associative Arrays (ассоциативного массива), индексированного целыми числами, первый и последний элементы - это те, у которых наименьший и самый большой индексы соответственно.
Рассмотрим пример на котором показаны значения FIRST и LAST для Associative Arrays, индексированного целым числом, удаляет первый и последний элементы и снова показывает значения FIRST и LAST.
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 |
DECLARE TYPE aa_type_int IS TABLE OF INTEGER INDEX BY PLS_INTEGER; aa_int aa_type_int; PROCEDURE print_first_and_last IS BEGIN DBMS_OUTPUT.PUT_LINE('FIRST = ' || aa_int.FIRST); DBMS_OUTPUT.PUT_LINE('LAST = ' || aa_int.LAST); END print_first_and_last; BEGIN aa_int(1) := 3; aa_int(2) := 6; aa_int(3) := 9; aa_int(4) := 12; DBMS_OUTPUT.PUT_LINE('Before deletions:'); print_first_and_last; aa_int.DELETE(1); aa_int.DELETE(4); DBMS_OUTPUT.PUT_LINE('After deletions:'); print_first_and_last; END; Результат: Before deletions: FIRST = 1 LAST = 4 After deletions: FIRST = 2 LAST = 3 |
Для Associative Arrays, индексированного строкой, первый и последний элементы - это те, у которых самые низкие и самые высокие значения ключа соответственно. Значения ключа находятся в отсортированном порядке.
В следующем примере показаны значения FIRST и LAST для Associative Arrays, индексированного по строке, удаляет первый и последний элементы и снова показывает значения FIRST и LAST.
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 |
DECLARE TYPE aa_type_str IS TABLE OF INTEGER INDEX BY VARCHAR2(10); aa_str aa_type_str; PROCEDURE print_first_and_last IS BEGIN DBMS_OUTPUT.PUT_LINE('FIRST = ' || aa_str.FIRST); DBMS_OUTPUT.PUT_LINE('LAST = ' || aa_str.LAST); END print_first_and_last; BEGIN aa_str('Z') := 26; aa_str('A') := 1; aa_str('K') := 11; aa_str('R') := 18; DBMS_OUTPUT.PUT_LINE('Before deletions:'); print_first_and_last; aa_str.DELETE('A'); aa_str.DELETE('Z'); DBMS_OUTPUT.PUT_LINE('After deletions:'); print_first_and_last; END; Результат: Before deletions: FIRST = A LAST = Z After deletions: FIRST = K LAST = R |
Примеры методов FIRST и LAST методы для Varray
Для не пустого (not empty) Varray, FIRST всегда возвращает 1.
Для каждого varray LAST всегда равен COUNT. Например.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
DECLARE TYPE NumList IS VARRAY(10) OF INTEGER; n NumList := NumList(1,3,5,7); PROCEDURE print_count_and_last IS BEGIN DBMS_OUTPUT.PUT('n.COUNT = ' || n.COUNT || ', '); DBMS_OUTPUT.PUT_LINE('n.LAST = ' || n.LAST); END print_count_and_last; BEGIN print_count_and_last; n.EXTEND(3); print_count_and_last; n.TRIM(5); print_count_and_last; END; Результат: n.COUNT = 4, n.LAST = 4 n.COUNT = 7, n.LAST = 7 n.COUNT = 2, n.LAST = 2 |
Следующий пример печатает Varray team используя цикл FOR LOOP с пределами team.FIRST и team.LAST. Поскольку Varray всегда ограниченный, то team(i) внутри цикла всегда существует.
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 50 51 |
DECLARE TYPE team_type IS VARRAY(4) OF VARCHAR2(15); team team_type; PROCEDURE print_team (heading VARCHAR2) IS BEGIN DBMS_OUTPUT.PUT_LINE(heading); IF team IS NULL THEN DBMS_OUTPUT.PUT_LINE('Does not exist'); ELSIF team.FIRST IS NULL THEN DBMS_OUTPUT.PUT_LINE('Has no members'); ELSE FOR i IN team.FIRST..team.LAST LOOP DBMS_OUTPUT.PUT_LINE(i || '. ' || team(i)); END LOOP; END IF; DBMS_OUTPUT.PUT_LINE('---'); END; BEGIN print_team('Team Status:'); team := team_type(); -- Команда создана, но в ней никого. print_team('Team Status:'); team := team_type('John', 'Mary'); -- Добавлено 2 члена в команду. print_team('Initial Team:'); team := team_type('Arun', 'Amitha', 'Allan', 'Mae'); -- Замена команды. print_team('New Team:'); END; Результат: Team Status: Does not exist --- Team Status: Has no members --- Initial Team: 1. John 2. Mary --- New Team: 1. Arun 2. Amitha 3. Allan 4. Mae --- |
Пример методов FIRST и LAST методы для Nested Tables
Для Nested Tables (вложенных таблицы) LAST равен COUNT, если вы не удаляете элементы из середины Nested Tables, в таком случае LAST больше, чем COUNT.
Рассмотрим пример, который, печатает Nested Tables team с помощью цикла FOR LOOP в диапазоне team.FIRST и team.LAST. Поскольку Nested Tables может быть неограниченной, оператор FOR LOOP печатает team(i), только если team.EXISTS(i) имеет значение TRUE.
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 50 51 52 53 54 55 56 57 |
DECLARE TYPE team_type IS TABLE OF VARCHAR2(15); team team_type; PROCEDURE print_team (heading VARCHAR2) IS BEGIN DBMS_OUTPUT.PUT_LINE(heading); IF team IS NULL THEN DBMS_OUTPUT.PUT_LINE('Does not exist'); ELSIF team.FIRST IS NULL THEN DBMS_OUTPUT.PUT_LINE('Has no members'); ELSE FOR i IN team.FIRST..team.LAST LOOP DBMS_OUTPUT.PUT(i || '. '); IF team.EXISTS(i) THEN DBMS_OUTPUT.PUT_LINE(team(i)); ELSE DBMS_OUTPUT.PUT_LINE('(to be hired)'); END IF; END LOOP; END IF; DBMS_OUTPUT.PUT_LINE('---'); END; BEGIN print_team('Team Status:'); team := team_type(); -- Команда создана, но в ней никого. print_team('Team Status:'); team := team_type('Arun', 'Amitha', 'Allan', 'Mae'); -- Добавляет членов. print_team('Initial Team:'); team.DELETE(2,3); -- Удалит 2-го and 3-го члена. print_team('Current Team:'); END; Результат: Team Status: Does not exist --- Team Status: Has no members --- Initial Team: 1. Arun 2. Amitha 3. Allan 4. Mae --- Current Team: 1. Arun 2. (to be hired) 3. (to be hired) 4. Mae --- |