Уроки модуля (2/4)
Расширенная логика с PL/pgSQL
Функции, написанные на LANGUAGE sql, могут выполнять стандартные запросы только один за другим. Если нам нужно что-то более сложное, например «ЕСЛИ введенная сумма больше 100, ТОГДА примените скидку», простой SQL не сможет сделать это сам по себе. Нам нужно использовать PL/pgSQL, полноценный процедурный язык программирования, встроенный в Postgres.
В PL/pgSQL мы добавляем классические тела, состоящие из BEGIN .. END, переменных и условных операторов.
CREATE OR REPLACE FUNCTION valuta_cliente(ordini INTEGER)
RETURNS TEXT AS $$
BEGIN
IF ordini > 10 THEN
RETURN 'VIP';
ELSE
RETURN 'Standard';
END IF;
END;
$$ LANGUAGE plpgsql;Эта мощь позволяет нам разгрузить огромные блоки повторяющейся логики, которые в противном случае мы бы написали на JS, упаковав их в безопасные и быстрые функции, выполняемые близко к данным с очень низкой задержкой!
Попробуйте сами
Нам нужна сложная функция, которая заменяет себя, если она уже существует («get_price_label»), принимает «цену» как ЧИСЛЕННУЮ и возвращает подробный ТЕКСТ.\nИспользуйте PL/pgSQL. Откройте BEGIN.\nНапишите логику: если цена > 100,00, верните строку «Премиум». ELSE вернет «Economico».\nЗакройте условный END; и тело.
Показать подсказку
СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ФУНКЦИЮ get_price_label(price NUMERIC) ВОЗВРАЩАЕТ ТЕКСТ AS $$ BEGIN, ЕСЛИ цена > 100,00, ТОГДА ВОЗВРАЩАЕТ «Премиум»; ELSE RETURN «Экономико»; КОНЕЦ ЕСЛИ; КОНЕЦ; $$ ЯЗЫК plpgsql;
Решение доступно после 3 попыток
Вы можете объявить временные переменные перед BEGIN с помощью ключевого слова DECLARE.\nНапишите функцию «saluta_utente(userid INTEGER)» -> Возвращает текст, логику PL/pgSQL.\nВнутри нее DECLARE строковую переменную «nome_utente TEXT;».\nЗатем внутри BEGIN заполните эту переменную именем first_name, динамически запрашивая «клиентов», используя специальное предложение «SELECT first_name». INTO nome_utente FROM... WHERE id = userid'. Наконец, RETURN объединяет переменную с Ciao.
Показать подсказку
ОБЪЯВИТЬ ТЕКСТ nome_utente; \nBEGIN SELECT first_name INTO nome_utente... \nRETURN 'Ciao ' || имя_утенте;
Решение доступно после 3 попыток