Управляющие конструкции — это основа любой программы, будь то 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. Эти знания пригодятся вам на практике при создании более сложных функций! В следующий раз мы рассмотрим циклы и их использование.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ