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-інтерфейсом). Він дозволяє ставити breakpoints і дивитися значення змінних у реальному часі. Якщо ти з тих, хто любить візуальних помічників, 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. Майстерність у цій справі приходить з досвідом, але кожен виправлений баг робить тебе трохи кращим!

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