Перейти к основному содержимому
Модуль 12 · Урок 2 из 446/57 в курсе~15 min
Уроки модуля (2/4)

Расширенная логика с PL/pgSQL

Функции, написанные на LANGUAGE sql, могут выполнять стандартные запросы только один за другим. Если нам нужно что-то более сложное, например «ЕСЛИ введенная сумма больше 100, ТОГДА примените скидку», простой SQL не сможет сделать это сам по себе. Нам нужно использовать PL/pgSQL, полноценный процедурный язык программирования, встроенный в Postgres.

В PL/pgSQL мы добавляем классические тела, состоящие из BEGIN .. END, переменных и условных операторов.

SQL
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, упаковав их в безопасные и быстрые функции, выполняемые близко к данным с очень низкой задержкой!

Попробуйте сами

Упражнение#sql.m12.l2.e1
Попыток: 0Загрузка…

Нам нужна сложная функция, которая заменяет себя, если она уже существует («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 попыток

Упражнение#sql.m12.l2.e2
Попыток: 0Загрузка…

Вы можете объявить временные переменные перед 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 попыток