Керуючі конструкції — це основа будь-якої програми, чи то SQL-скрипт, Python-код або навіть робот на Марсі, який думає, відправити сигнал додому чи пошукати життя за рогом кратера.
У PL/pgSQL керуючі конструкції допомагають нам:
- Виконувати певні дії, якщо умови виконуються.
- Контролювати порядок виконання коду.
- Реалізовувати логіку прийняття рішень.
Можеш уявити їх як дорожні знаки на дорозі: "Якщо бачиш STOP — зупинись. Якщо бачиш зелений — їдь!"
Найпопулярніші керуючі конструкції в PL/pgSQL:
IF– перевіряє умову і виконує відповідні команди.CASE– альтернативаIF, коли умов багато.RETURN– завершує виконання функції і повертає результат.
Ти вже маєш уявлення про них. Ну, і після мов програмування розібратися з ними буде дуже просто.
Умовний оператор IF
Оператор IF використовується для виконання коду тільки якщо певна умова TRUE (істинна). Ось його базова структура:
IF умова THEN
-- Код, який виконується, якщо умова істинна.
ELSE
-- Альтернативний код, якщо умова хибна.
END IF;
Напишемо функцію, яка приймає число і повертає, парне воно чи непарне:
CREATE OR REPLACE FUNCTION check_even_odd(num INTEGER)
RETURNS TEXT AS $$
BEGIN
IF num % 2 = 0 THEN
RETURN 'Число парне';
ELSE
RETURN 'Число непарне';
END IF;
END;
$$ LANGUAGE plpgsql;
Тепер протестуємо її:
SELECT check_even_odd(4); -- Число парне
SELECT check_even_odd(7); -- Число непарне
Коротке пояснення: IF num % 2 = 0 THEN перевіряє, чи ділиться число на 2 без залишку.
Умова ELSIF
Іноді однієї перевірки недостатньо, і тобі треба перевіряти кілька умов. Для цього існує ELSIF.
Припустимо, у нас є функція, яка повертає текстове повідомлення про температуру:
CREATE OR REPLACE FUNCTION temperature_comment(temp INTEGER)
RETURNS TEXT AS $$
BEGIN
IF temp < 0 THEN
RETURN 'Дуже холодно!';
ELSIF temp >= 0 AND temp <= 20 THEN
RETURN 'Прохолодно';
ELSE
RETURN 'Тепло!';
END IF;
END;
$$ LANGUAGE plpgsql;
Тестуємо:
SELECT temperature_comment(-5); -- Дуже холодно!
SELECT temperature_comment(15); -- Прохолодно
SELECT temperature_comment(25); -- Тепло!
Синтаксис CASE
Якщо у тебе багато умов, оператор CASE стає рятівником. Він трохи схожий на IF, але більш "елегантний".
CASE
WHEN умова_1 THEN значення_1
WHEN умова_2 THEN значення_2
ELSE значення_за_замовчуванням
END;
Створимо функцію, яка повертає текстову оцінку на основі числа:
CREATE OR REPLACE FUNCTION grade_comment(score INTEGER)
RETURNS TEXT AS $$
BEGIN
RETURN CASE
WHEN score >= 90 THEN 'Відмінно'
WHEN score >= 75 THEN 'Добре'
WHEN score >= 50 THEN 'Задовільно'
ELSE 'Незадовільно'
END;
END;
$$ LANGUAGE plpgsql;
Тестуємо:
SELECT grade_comment(95); -- Відмінно
SELECT grade_comment(80); -- Добре
SELECT grade_comment(45); -- Незадовільно
Примітка: на відміну від IF, CASE повертає значення, тому оператор RETURN можна використовувати прямо всередині CASE.
Оператор RETURN
RETURN завершує виконання функції і повертає значення. Це критично важливо для функцій у PL/pgSQL, які мають щось повертати (наприклад, текст, число тощо).
Подивимось, як працює RETURN на простому прикладі:
CREATE OR REPLACE FUNCTION return_example()
RETURNS TEXT AS $$
BEGIN
RETURN 'Hello, World!';
END;
$$ LANGUAGE plpgsql;
Результат:
SELECT return_example(); -- Hello, World!
Але що, якщо у нас кілька гілок коду? Наприклад, перевірка вхідних даних. Тоді RETURN буде використовуватись у різних місцях функції:
CREATE OR REPLACE FUNCTION check_positive_negative(num INTEGER)
RETURNS TEXT AS $$
BEGIN
IF num > 0 THEN
RETURN 'Додатнє число';
ELSIF num = 0 THEN
RETURN 'Нуль';
ELSE
RETURN 'Від’ємне число';
END IF;
END;
$$ LANGUAGE plpgsql;
Тестуємо:
SELECT check_positive_negative(10); -- Додатнє число
SELECT check_positive_negative(0); -- Нуль
SELECT check_positive_negative(-5); -- Від’ємне число
Типові помилки і де можна заплутатись
- Пропуск оператора
END: забудешEND CASE;абоEND IF;— і PostgreSQL одразу нагадає про необхідність завершити блок коду. - Логічні помилки при використанні
ELSIF: порядок умов важливий! Більш загальна умова (temp > 0) не повинна йти раніше більш специфічної (temp > 20). - Забув про
RETURN: у PL/pgSQL функція обов’язково має щось повертати, якщо ти оголосивRETURNS.
На цьому все. Ми розглянули основи керуючих конструкцій і логіки в PL/pgSQL. Ці знання знадобляться тобі на практиці при створенні складніших функцій! Наступного разу розглянемо цикли та їх використання.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ