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;

Це розширення спеціально створене для взаємодії з debugger'ом.

Дуже важливо!!! Переконайся, що у тебе є права адміністратора на сервері PostgreSQL, щоб виконати цей запит.

Основи відлагодження: встановлення точок зупинки (breakpoints)

Точки зупинки (breakpoints) — це спеціальні місця в коді, де виконання процедури або функції зупиняється, щоб дати тобі можливість зазирнути всередину процесу. Це як коротка зупинка в довгій дорозі: зупинився, оглянувся, перевірив карту, а потім поїхав далі.

Як поставити точку зупинки в pgAdmin?

  1. Відкрий pgAdmin і підключись до своєї бази даних.
  2. Знайди свою функцію або процедуру в дереві об'єктів: Functions<твоя схема><твоя функція>.
  3. Клікни правою кнопкою миші по функції і вибери Debugging → Debug. Це запустить debugger.
  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, debugger покаже, що змінні price і discount вже мають значення, але discounted_price поки що порожня.

Ось так виглядає список змінних після зупинки:

Змінна Значення
price 100.00
discount 15.00
discounted_price NULL

Після того, як ти виконаєш поточний рядок, discounted_price зміниться на 85.00.

Покрокове виконання коду

У вікні debugger'а ти можеш керувати виконанням своєї функції за допомогою кнопок:

  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. Помилка підключення debugger'а. Переконайся, що сервер PostgreSQL налаштований для роботи з відлагодженням (параметри shared_preload_libraries включають pldbgapi).

Використання pgAdmin для відлагодження PL/pgSQL робить процес відлагодження неймовірно простим і інтуїтивним. Постав точку зупинки, подивись, чим "живуть" твої змінні, і виправ усі недоліки — це вже півдороги до твого ідеального застосунку!

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ