В этом учебном материале вы узнаете, как использовать метод коллекций DELETE в Oracle PL/SQL с синтаксисом и примерами.
Описание
В Oracle PL/SQL метод DELETE удаляет все элементы из коллекции любого типа. Эта операция немедленно освобождает память, выделенную для удаляемых элементов.
Синтаксис
Синтаксис метода коллекций DELETE в Oracle PL/SQL.
collection_name.DELETE (m, n);
Параметры или аргументы
collection_name - имя коллекции один из следующих типов associative arrays или nested tables.
DELETE(n) - удаляет элемент, индекс которого равен n, если этот элемент существует; в противном случае он ничего не делает.
DELETE(m,n) удаляет все элементы, индексы которых находятся в диапазоне m..n, если существуют как m, так и n, а m <= n; в противном случае он ничего не делает.
Примечание
- Смотрите также методы коллекций: TRIM, EXTEND, EXISTS,FIRST и LAST, COUNT, LIMIT,PRIOR и NEXT.
Пример
Рассмотрим некоторые пример, чтобы понять как использовать метод коллекций DELETE в Oracle PL/SQL.
Пример метода DELETE с Nested Tables
В этом примере мы используем Nested Tables и делаем следующее:
- объявляем переменную Nested Tables
- инициализируем ее шестью элементами
- удаляем и затем восстанавливаем второй элемент
- удаляем ряд элементов, а затем восстанавливаем один из них
- и в конце удаляем все элементы
Восстановленные элементы занимают ту же память, что и соответствующие удаленные элементы. Процедура print_nt печатает переменную Nested Tables после инициализации и после каждой операции DELETE.
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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
CREATE OR REPLACE TYPE nt_type IS TABLE OF NUMBER; CREATE OR REPLACE PROCEDURE print_nt (nt nt_type) IS i NUMBER; BEGIN i := nt.FIRST; IF i IS NULL THEN DBMS_OUTPUT.PUT_LINE('nt is empty'); ELSE WHILE i IS NOT NULL LOOP DBMS_OUTPUT.PUT('nt.(' || i || ') = '); print(nt(i)); i := nt.NEXT(i); END LOOP; END IF; DBMS_OUTPUT.PUT_LINE('---'); END print_nt; DECLARE nt nt_type := nt_type(11, 22, 33, 44, 55, 66); BEGIN print_nt(nt); nt.DELETE(2); -- Удаляет второй элемент print_nt(nt); nt(2) := 2222; -- Восстанавливает второй элемент print_nt(nt); nt.DELETE(2, 4); -- Удаляет диапазон элементов print_nt(nt); nt(3) := 3333; -- Восстанавливает третий элемент print_nt(nt); nt.DELETE; -- Удаляет все элементы print_nt(nt); END; Результат: nt.(1) = 11 nt.(2) = 22 nt.(3) = 33 nt.(4) = 44 nt.(5) = 55 nt.(6) = 66 --- nt.(1) = 11 nt.(3) = 33 nt.(4) = 44 nt.(5) = 55 nt.(6) = 66 --- nt.(1) = 11 nt.(2) = 2222 nt.(3) = 33 nt.(4) = 44 nt.(5) = 55 nt.(6) = 66 --- nt.(1) = 11 nt.(5) = 55 nt.(6) = 66 --- nt.(1) = 11 nt.(3) = 3333 nt.(5) = 55 nt.(6) = 66 --- nt is empty --- |
Пример метода DELETE с Associative Arrays
Следующий пример заполняет Associative Arrays, индексированный строкой, и удаляет все элементы, что освобождает выделенную им память. Затем пример заменяет удаленные элементы, то есть добавляет новые элементы, которые имеют те же индексы, что и удаленные элементы. Новые элементы замены не занимают ту же память, что и соответствующие удаленные элементы. Наконец, пример удаляет один элемент, а затем ряд элементов. Процедура print_aa_str показывает эффекты операций.
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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
DECLARE TYPE aa_type_str IS TABLE OF INTEGER INDEX BY VARCHAR2(10); aa_str aa_type_str; PROCEDURE print_aa_str IS i VARCHAR2(10); BEGIN i := aa_str.FIRST; IF i IS NULL THEN DBMS_OUTPUT.PUT_LINE('aa_str is empty'); ELSE WHILE i IS NOT NULL LOOP DBMS_OUTPUT.PUT('aa_str.(' || i || ') = '); print(aa_str(i)); i := aa_str.NEXT(i); END LOOP; END IF; DBMS_OUTPUT.PUT_LINE('---'); END print_aa_str; BEGIN aa_str('M') := 13; aa_str('Z') := 26; aa_str('C') := 3; print_aa_str; aa_str.DELETE; -- Delete all elements print_aa_str; aa_str('M') := 13; -- Заменит удаленный элемент тем же значением aa_str('Z') := 260; -- Заменит удаленный элемент новым значением aa_str('C') := 30; -- Заменит удаленный элемент новым значением aa_str('W') := 23; -- Добавит новый элемент aa_str('J') := 10; -- Добавит новый элемент aa_str('N') := 14; -- Добавит новый элемент aa_str('P') := 16; -- Добавит новый элемент aa_str('W') := 23; -- Добавит новый элемент aa_str('J') := 10; -- Добавит новый элемент print_aa_str; aa_str.DELETE('C'); -- Удаляет один элемент print_aa_str; aa_str.DELETE('N','W'); -- Удаляет диапазон элементов print_aa_str; aa_str.DELETE('Z','M'); -- Ничего не делает print_aa_str; END; Результат: aa_str.(C) = 3 aa_str.(M) = 13 aa_str.(Z) = 26 --- aa_str is empty --- aa_str.(C) = 30 aa_str.(J) = 10 aa_str.(M) = 13 aa_str.(N) = 14 aa_str.(P) = 16 aa_str.(W) = 23 aa_str.(Z) = 260 --- aa_str.(J) = 10 aa_str.(M) = 13 aa_str.(N) = 14 aa_str.(P) = 16 aa_str.(W) = 23 aa_str.(Z) = 260 --- aa_str.(J) = 10 aa_str.(M) = 13 aa_str.(Z) = 260 --- aa_str.(J) = 10 aa_str.(M) = 13 aa_str.(Z) = 260 --- |