JavaRush /Курсы /SQL SELF /Введение в отладку PL/pgSQL

Введение в отладку PL/pgSQL

SQL SELF
55 уровень , 0 лекция
Открыта

Итак, представьте, что вы разработали сложную функцию или процедуру. Вы уже видите, как круто работает ваша база данных, но вдруг — бац! — данные не те, запросы выполняются медленно, и начальство начинает нервничать. Вот тут на сцену выходит отладка.

Отладка в PL/pgSQL нужна, чтобы:

  • Найти ошибки логики, например, когда функция возвращает не то, что от нее ожидали.
  • Разобраться с некорректными входными данными. Потому что иногда пользователи базы данных вводят не только данные, но и... нечто совершенно непонятное!
  • Устранить проблемы производительности. Ведь написанный на скорую руку код может работать, как черепаха, ищущая Wi-Fi в пустыне Сахара.

Если серьёзно, отладка — это не просто поиск и исправление ошибок. Это способ улучшить ваш код, сделать его быстрее, эффективнее и читаемее.

Основные подходы к отладке PL/pgSQL

Отладка в PL/pgSQL может быть выполнена несколькими способами. Давайте разберем их по порядку.

  1. Использование встроенных инструментов PostgreSQL

PostgreSQL предоставляет несколько встроенных возможностей для диагностики, включая функции логирования (RAISE NOTICE и RAISE EXCEPTION), а также анализ плана выполнения запросов (EXPLAIN ANALYZE). Эти инструменты помогают понять, что происходит внутри вашей функции.

  1. Логирование с помощью RAISE NOTICE

RAISE NOTICE — это ваш друг, если вы хотите понять, какие данные проходят через функцию, на каком этапе что-то пошло не так, или проверить значения переменных. В отличие от RAISE EXCEPTION, он не прерывает выполнение функции. Например, можно выводить содержимое переменной на каждом этапе выполнения.

DO $$
DECLARE
    counter INT := 0;
BEGIN
    FOR counter IN 1..5 LOOP
        RAISE NOTICE 'Текущее значение счётчика: %', counter;
    END LOOP;
END $$;

Этот код выводит значения counter от 1 до 5. Простая магия, но очень полезная для отладки!

  1. Использование сторонних инструментов

Отладка PL/pgSQL может быть выполнена с помощью таких инструментов, как pgAdmin (с GUI-интерфейсом). Он позволяет ставить точки останова и просматривать значения переменных в реальном времени. Если вы из тех, кто любит визуальных помощников, pgAdmin станет отличным союзником.

Этапы отладки

Когда мы начинаем отладку функции или процедуры, важно следовать определённой последовательности. Остановимся на каждом этапе подробнее:

  1. Анализ входных данных

Первое, с чем стоит разобраться, — это входные данные. Убедитесь, что данные, которые получает ваша функция, не содержат ошибок или неожиданных значений. Например, вы можете проверить все входные параметры с помощью RAISE NOTICE:

CREATE FUNCTION check_input(x INTEGER) RETURNS VOID AS $$
BEGIN
    IF x IS NULL THEN
        RAISE EXCEPTION 'Входное значение не должно быть NULL!';
    END IF;
    RAISE NOTICE 'Входное значение: %', x;
END;
$$ LANGUAGE plpgsql;

Этот пример иллюстрирует, как предупреждать пользователей о проблемах с входными данными.

  1. Проверка выполнения каждого этапа

Разбейте свою функцию на логические блоки и добавьте RAISE NOTICE в ключевых точках. Это поможет вам понять, где именно что-то пошло не так.

CREATE FUNCTION calculate_discount(price NUMERIC, discount NUMERIC) RETURNS NUMERIC AS $$
BEGIN
    RAISE NOTICE 'Начало функции: цена %, скидка %', price, discount;

    IF price <= 0 THEN
        RAISE EXCEPTION 'Цена не может быть отрицательной или равной нулю!';
    END IF;

    IF discount < 0 OR discount > 100 THEN
        RAISE EXCEPTION 'Скидка должна быть между 0 и 100!';
    END IF;

    RETURN price - (price * discount / 100);
END;
$$ LANGUAGE plpgsql;

Здесь на каждом этапе отладки выводятся полезные сообщения о состоянии процесса.

  1. Оптимизация и устранение проблем
  2. После того как вы идентифицировали ошибку, исправьте её. Если проблема связана с производительностью, используйте инструменты анализа, такие как EXPLAIN ANALYZE, чтобы оптимизировать запросы.

Практическое применение навыков отладки

Давайте рассмотрим реальную задачу: у нас есть функция, которая добавляет запись в таблицу и возвращает сгенерированный идентификатор. Кажется, что всё логично и просто, но иногда функция завершается ошибкой, и мы хотим понять почему.

Исходная функция:

CREATE FUNCTION add_student(name TEXT, age INTEGER) RETURNS INTEGER AS $$
DECLARE
    new_id INTEGER;
BEGIN
    INSERT INTO students (name, age) VALUES (name, age) RETURNING id INTO new_id;
    RETURN new_id;
END;
$$ LANGUAGE plpgsql;

При вызове этой функции с некорректными данными, например, age < 0, она выдает ошибку. Улучшим её с помощью отладочных средств.

Улучшенная функция с логированием:

CREATE FUNCTION add_student(name TEXT, age INTEGER) RETURNS INTEGER AS $$
DECLARE
    new_id INTEGER;
BEGIN
    -- Логируем входные данные
    RAISE NOTICE 'Добавление студента: имя %, возраст %', name, age;

    -- Проверяем корректность возраста
    IF age < 0 THEN
        RAISE EXCEPTION 'Возраст не может быть отрицательным!';
    END IF;

    -- Добавляем студента и возвращаем его ID
    INSERT INTO students (name, age) VALUES (name, age) RETURNING id INTO new_id;

    -- Логируем успешное выполнение
    RAISE NOTICE 'Студент добавлен с ID %', new_id;

    RETURN new_id;
END;
$$ LANGUAGE plpgsql;

Теперь, если возникнет ошибка, вы будете точно знать, что пошло не так, благодаря выводу сообщений с помощью RAISE NOTICE.

Полезные советы напоследок

  1. Не забывайте убирать ненужные логирования в рабочем коде. RAISE NOTICE — это великолепный инструмент для отладки, но его постоянное использование может загромождать логи в продакшене.
  2. Работайте с маленькими кусками кода. Если функция слишком сложная, разбейте её на несколько частей. Это облегчит отладку.
  3. Тренируйтесь регулярно. Чем больше вы пишете и отлаживаете код, тем быстрее вы становитесь в поиске и исправлении ошибок.

Отладка — это как игра в детективов, только вместо увеличительного стекла у вас SQL-запросы и логика PL/pgSQL. Мастерство в этом деле приходит с опытом, но каждый исправленный баг делает вас чуть-чуть лучше!

2
Задача
SQL SELF, 55 уровень, 0 лекция
Недоступна
Проверка входных данных с помощью RAISE EXCEPTION и RAISE NOTICE
Проверка входных данных с помощью RAISE EXCEPTION и RAISE NOTICE
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Ra Уровень 35 Student
21 августа 2025
Ненужная статья, лучше бы непройденную теорию добавили.