PL/SQL - Коллекции: Ваш путь к эффективной обработке данных
Здравствуйте, стремящиеся к PL/SQL разработчики! Я рад помочь вам изучить fascinирующий мир PL/SQL Коллекций. Как ваш доброжелательный соседский компьютерный учитель с многолетним опытом, я обещаю сделать это путешествие как enlightening, так и приятным. Так что возьмите ваши виртуальные блокноты и погружайтесь!
Что такое PL/SQL Коллекции?
Прежде чем мы углубимся в детали, давайте поймем, что такое коллекции. Представьте, что вы организовываете день рождения и вам нужно следить за всеми своими гостями. Вместо того чтобы записывать каждое имя на отдельный листок бумаги, не было бы ли проще иметь один список? Именно такcollections работают в PL/SQL – они позволяют нам группировать связанные данные вместе.
Теперь давайте рассмотрим типы коллекций, которые предлагает нам PL/SQL.
H2: Таблица по индексу (Ассоциативный массив)
Таблица по индексу, также известная как Ассоциативный массив, похожа на магическую адресную книгу. Вместо того чтобы просто хранить имена, вы можете associировать каждое имя с дополнительной информацией.
H3: Объявление таблицы по индексу
Давайте создадим нашу первую таблицу по индексу:
DECLARE
TYPE guest_list_type IS TABLE OF VARCHAR2(50) INDEX BY VARCHAR2(20);
guest_list guest_list_type;
BEGIN
guest_list('Alice') := 'Приносит торт';
guest_list('Bob') := 'Приносит шарики';
guest_list('Charlie') := 'Приносит музыку';
DBMS_OUTPUT.PUT_LINE('Alice это ' || guest_list('Alice'));
END;
В этом примере мы создали список гостей, где каждый гость (индекс) associируется с тем, что он приносит на вечеринку. Когда мы запустим этот код, он выведет: "Alice это Приносит торт".
H3: Прохождение по таблице по индексу
Теперь давайте посмотрим, как мы можем пройти через наш список гостей:
DECLARE
TYPE guest_list_type IS TABLE OF VARCHAR2(50) INDEX BY VARCHAR2(20);
guest_list guest_list_type;
guest VARCHAR2(20);
BEGIN
guest_list('Alice') := 'Приносит торт';
guest_list('Bob') := 'Приносит шарики';
guest_list('Charlie') := 'Приносит музыку';
guest := guest_list.FIRST;
WHILE guest IS NOT NULL LOOP
DBMS_OUTPUT.PUT_LINE(guest || ' это ' || guest_list(guest));
guest := guest_list.NEXT(guest);
END LOOP;
END;
Этот код перечислит всех наших гостей и то, что они приносят. Это как идти по вашему списку вечеринок!
H2: Вложенные таблицы
Вложенные таблицы похожи на расширяемые списки. Представьте, что вы планируете несколько вечеринок, и у каждой вечеринки есть свой список гостей, который может увеличиваться или уменьшаться.
H3: Объявление и инициализация вложенной таблицы
Давайте создадим вложенную таблицу для планирования наших вечеринок:
DECLARE
TYPE guest_list_type IS TABLE OF VARCHAR2(50);
birthday_party guest_list_type := guest_list_type('Alice', 'Bob', 'Charlie');
BEGIN
DBMS_OUTPUT.PUT_LINE('Первый гость: ' || birthday_party(1));
birthday_party.EXTEND;
birthday_party(4) := 'David';
DBMS_OUTPUT.PUT_LINE('Новый гость: ' || birthday_party(4));
END;
Здесь мы начинаем с трех гостей и затем добавляем четвертого. Вывод покажет "Первый гость: Alice" и "Новый гость: David".
H2: Методы коллекций
Коллекции приходят с内置 методами, которые делают нашу жизнь легче. Представьте их как особые способности для обработки наших списков.
H3: Общие методы коллекций
Вот таблица некоторых общих методов коллекций:
Метод | Описание |
---|---|
COUNT | Возвращает количество элементов |
FIRST | Возвращает индекс первого элемента |
LAST | Возвращает индекс последнего элемента |
NEXT | Возвращает индекс следующего элемента |
PRIOR | Возвращает индекс предыдущего элемента |
EXISTS | Проверяет, существует ли элемент в конкретном индексе |
EXTEND | Добавляет один или несколько элементов в конец коллекции |
TRIM | Удаляет один или несколько элементов из конца коллекции |
DELETE | Удаляет элементы из коллекции |
Давайте посмотрим, как некоторые из них работают:
DECLARE
TYPE number_list_type IS TABLE OF NUMBER;
numbers number_list_type := number_list_type(10, 20, 30, 40, 50);
BEGIN
DBMS_OUTPUT.PUT_LINE('Количество элементов: ' || numbers.COUNT);
DBMS_OUTPUT.PUT_LINE('Первый элемент: ' || numbers(numbers.FIRST));
DBMS_OUTPUT.PUT_LINE('Последний элемент: ' || numbers(numbers.LAST));
numbers.DELETE(3); -- Удаляет третий элемент
IF NOT numbers.EXISTS(3) THEN
DBMS_OUTPUT.PUT_LINE('Элемент 3 больше не существует!');
END IF;
END;
Этот код демонстрирует подсчет элементов, доступ к первому и последнему элементам, удаление элемента и проверку существования элемента.
H2: Исключения коллекций
Даже最好的 планы могут пойти наперекосяк, и то же самое верно и для коллекций. PL/SQL предоставляет específicas исключения, чтобы помочь нам优雅но обрабатывать ошибки, связанные с коллекциями.
H3: Общие исключения коллекций
Исключение | Описание |
---|---|
COLLECTION_IS_NULL | Возникает при попытке operate на null коллекции |
NO_DATA_FOUND | Возникает при доступе к несуществующему элементу |
SUBSCRIPT_BEYOND_COUNT | Возникает при доступе к элементу за пределами текущего размера |
SUBSCRIPT_OUTSIDE_LIMIT | Возникает при использовании индекса за пределами разрешенного диапазона |
Давайте посмотрим, как мы можем обрабатывать эти исключения:
DECLARE
TYPE number_list_type IS TABLE OF NUMBER;
numbers number_list_type;
BEGIN
-- Это вызовет COLLECTION_IS_NULL
numbers(1) := 10;
EXCEPTION
WHEN COLLECTION_IS_NULL THEN
DBMS_OUTPUT.PUT_LINE('Ой! Коллекция null. Давайте инициализируем её.');
numbers := number_list_type(10, 20, 30);
DBMS_OUTPUT.PUT_LINE('Теперь у нас есть ' || numbers.COUNT || ' элементов.');
END;
Этот код пытается добавить элемент в null коллекцию, перехватывает исключение и затем правильно инициализирует коллекцию.
В заключение, PL/SQL Коллекции – это мощные инструменты, которые позволяют нам эффективно управлять группами данных. Независимо от того, планируете ли вы вечеринку или обрабатываете сложные операции с базой данных, овладение коллекциями сделает ваше путешествие в PL/SQL намного более гладким.
помните, что практика makes perfect! Попробуйте создать свои собственные коллекции, экспериментируйте с различными методами и не бойтесь исключений – они помогут вам учиться и писать более robust код.
Счастливого кодирования, будущие маги PL/SQL!
Credits: Image by storyset