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 лекция
Недоступна
Отладка функции с несколькими переменными
Отладка функции с несколькими переменными
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ