PL/SQL - Коллекции: Ваш путь к эффективной обработке данных

Здравствуйте, стремящиеся к PL/SQL разработчики! Я рад помочь вам изучить fascinирующий мир PL/SQL Коллекций. Как ваш доброжелательный соседский компьютерный учитель с многолетним опытом, я обещаю сделать это путешествие как enlightening, так и приятным. Так что возьмите ваши виртуальные блокноты и погружайтесь!

PL/SQL - Collections

Что такое 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