JavaRush /Курсы /SQL SELF /Отладка PL/pgSQL через pgAdmin: точки останова, просмотр ...

Отладка PL/pgSQL через pgAdmin: точки останова, просмотр переменных

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

Итак, вы написали свою первую процедуру или функцию, запустили её, но что-то пошло не так. Вы, конечно, можете добавить кучу RAISE NOTICE, чтобы понять, где именно "корабль сел на рифы". Но! Зачем нам мучиться, если есть pgAdmin с встроенной отладкой?

pgAdmin предоставляет возможность пошагово выполнять код, устанавливать точки останова (breakpoints), просматривать значения переменных и искать причины ошибок. Это буквально ваш "детективный набор" для расследования загадки: "Почему мой запрос не работает?".

Зачем нужна отладка через pgAdmin?

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

С помощью отладки в pgAdmin вы можете:

  1. Установить точки останова (breakpoints) — это места, где выполнение кода остановится, чтобы вы могли проанализировать его текущее состояние.
  2. Пошагово пройтись по SQL-коду — в буквальном смысле шаг за шагом посмотреть, какой оператор выполняется.
  3. значения переменных в реальном времени — убедиться, что данные передаются и обрабатываются корректно.
  4. Найти место, где возникла ошибка, и понять её причину.

Как начать: подготовка к отладке в pgAdmin

Прежде чем приступить к отладке, давайте убедимся, что всё настроено правильно.

Включение расширения plpgsql

Убедитесь, что в вашей базе данных включен язык программирования PL/pgSQL:

CREATE EXTENSION IF NOT EXISTS plpgsql;

Этот язык обычно включён по умолчанию в PostgreSQL, но лучше проверить.

Убедитесь, что установлен pgAdmin версии 4 или выше (он поддерживает отладку). Если у вас его ещё нет, вы можете скачать pgAdmin с официального сайта.

Установка расширения pldbgapi

Для того чтобы включить отладку PL/pgSQL в pgAdmin, нужно активировать расширение pldbgapi:

CREATE EXTENSION IF NOT EXISTS pldbgapi;

Это расширение специально разработано для взаимодействия с отладчиком.

Очень важно!!! Убедитесь, что у вас есть права администратора на сервере PostgreSQL, чтобы выполнить данный запрос.

Основы отладки: установка точек останова (breakpoints)

Точки останова (breakpoints) — это специальные места в коде, где выполнение процедуры или функции останавливается, чтобы дать вам возможность заглянуть внутрь процесса. Это как короткий перерыв в длинной дороге: остановились, осмотрелись, проверили карту, а затем продолжили дальше.

Как установить точку останова в pgAdmin?

  1. Откройте pgAdmin и подключитесь к вашей базе данных.
  2. Найдите вашу функцию или процедуру в дереве объектов: Functions<ваша схема><ваша функция>.
  3. Кликните правой кнопкой мыши по функции и выберите Debugging → Debug. Это запустит отладчик.
  4. В открывшемся окне с кодом функции найдите строку, с которой вы хотите начать отладку, и щёлкните на полях слева от строки. Вы увидите красный кружок — это и есть точка останова.

Вот как это выглядит:

CREATE OR REPLACE FUNCTION example_function(id INTEGER)
RETURNS VOID AS $$
BEGIN
    RAISE NOTICE 'Вы выбрали id: %', id;
    -- Здесь можно установить точку останова
    PERFORM some_operation(id);
END;
$$ LANGUAGE plpgsql;

После того как точка останова установлена, вы можете запустить выполнение вашей функции, и выполнение остановится ровно на том месте. Теперь вы можете проверить значения переменных, результаты выполнения предыдущих операторов и, конечно, продолжить выполнение кода.

Просмотр переменных в pgAdmin

Знать, что ваш код остановился, это хорошо. Но гораздо полезнее понять, какие данные в этот момент находятся в памяти. Например:

  • Какие значения имеют входные параметры.
  • Как изменились переменные после выполнения определённого блока.
  • Что вернул запрос в базу.

Как посмотреть значения переменных?

Когда выполнение функции останавливается на точке останова:

  1. Перейдите на вкладку Variables в нижней части окна отладки.
  2. Здесь вы увидите перечень всех переменных и их текущие значения.

Допустим, у нас есть функция:

CREATE OR REPLACE FUNCTION calculate_discount(price NUMERIC, discount NUMERIC)
RETURNS NUMERIC AS $$
DECLARE
    discounted_price NUMERIC;
BEGIN
    discounted_price := price - (price * discount / 100);
    RETURN discounted_price;
END;
$$ LANGUAGE plpgsql;

Если вы установите точку останова на строке с discounted_price, отладчик покажет, что переменные price и discount уже имеют значения, но discounted_price пока пуст.

Вот так выглядит список переменных после остановки:

Переменная Значение
price 100.00
discount 15.00
discounted_price NULL

После того, как вы выполните текущую строку, discounted_price изменится на 85.00.

Пошаговое выполнение кода

В окне отладчика вы можете управлять выполнением вашей функции с помощью кнопок:

  1. Step Over — выполняет текущий оператор и переходит к следующему.
  2. Step Into — позволяет "погрузиться" в вызываемую функцию или процедуру.
  3. Continue — продолжает выполнение функции до следующей точки останова или завершения выполнения.

Практическое применение: отладка сложных функций

Давайте попробуем написать и отладить более сложную функцию.

Пример: обработка заказов

CREATE OR REPLACE FUNCTION process_order(order_id INTEGER)
RETURNS TEXT AS $$
DECLARE
    order_status TEXT;
    total_amount NUMERIC;
BEGIN
    -- Устанавливаем статус заказа
    SELECT status INTO order_status
    FROM orders
    WHERE id = order_id;

    IF order_status = 'Pending' THEN
        -- Рассчитываем сумму заказа
        SELECT SUM(price * quantity) INTO total_amount
        FROM order_items
        WHERE order_id = order_id;

        -- Обновляем статус заказа
        UPDATE orders
        SET status = 'Processed', processed_date = NOW()
        WHERE id = order_id;

        RETURN 'Заказ обработан. Сумма: ' || total_amount;
    ELSE
        RETURN 'Заказ уже обработан или не существует.';
    END IF;
END;
$$ LANGUAGE plpgsql;

Возможные точки останова:

  1. На строке SELECT status INTO order_status.
  2. На строке SELECT SUM(price * quantity) INTO total_amount.

В процессе отладки можно:

  • Убедиться, что order_status действительно имеет значение 'Pending'.
  • Проверить, корректно ли рассчитывается total_amount.

Частые ошибки и пути их решения

Во время отладки через pgAdmin вы можете столкнуться с такими ситуациями:

  1. Вы не видите вашу функцию в списке. Убедитесь, что функция действительно создана в вашей базе данных и что вы подключены к правильной базе.
  1. Точки останова не работают. Проверьте, включено ли расширение pldbgapi и есть ли у вас необходимые права.

  2. Ошибка подключения отладчика. Убедитесь, что сервер PostgreSQL настроен для работы с отладкой (параметры shared_preload_libraries включают pldbgapi).

Использование pgAdmin для отладки PL/pgSQL делает процесс отладки невероятно простым и интуитивным. Установите точку останова, посмотрите, чем "дышат" ваши переменные, и исправьте все недочёты — это уже полпути к вашему идеальному приложению!

2
Задача
SQL SELF, 56 уровень, 0 лекция
Недоступна
Отладка функции с несколькими переменными
Отладка функции с несколькими переменными
Комментарии (2)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
ТимБай Уровень 61
6 августа 2026
Важное про pldbgapi pldbgapi — это расширение для отладки PL/pgSQL. Оно не работает в современных версиях PostgreSQL (начиная примерно с PG 12+), потому что API отладчика убрали. В PG 18 его легально «включить» нельзя: нет совместимых бинарных расширений под эту версию. Что можно вместо этого: Использовать RAISE NOTICE, логирование и EXPLAIN (ANALYZE, BUFFERS) для отладки функций. Если критично именно отлаживать пошагово — завести отдельный старый контейнер (например, PG 9.6 или 10) строго под отладку, но это не рекомендуется для продакшена. Дальше даю стек без pldbgapi (он всё равно не заработает на PG 18), но со всем остальным.
Анатолий Уровень 63
23 апреля 2026
❤️