Статья основана на шестом видео из 31 темы курса SQL 2.0 — PL/pgSQL в PostgreSQL от Аристова Евгения, который является логическим продолжением курса SQL c 0. Ссылки на видео на платформах RUTUBE и VK видео.
В данной статье подробно разбираются понятие блока, его структура, оформление, реализация, вложенные блоки.
В прошлой статье мы разобрали присваивание значения переменной, типы данных, как и где их использовать.
Презентация и исходники доступны по ссылке.
Блоки. Понятие и варианты реализации
PL/pgSQL это блочно-структурированный язык. Текст тела функции должен быть блоком. Структура блока:
[ <<метка>> ]
[ DECLARE
объявления ]
BEGIN
операторы
END [ метка ];
Каждое объявление блока должно начинаться с BEGIN и завершаться END и символом «;»(точка с запятой). Блок, вложенный в другой блок, также должен иметь точку с запятой после END, как показано выше. Однако финальный END, завершающий тело функции, не требует точки с запятой.
Метка требуется тогда, когда нужно идентифицировать блок в операторе EXIT, CONTINUE или дополнить имена переменных, объявленных в этом блоке. Если метка указана после END, то она должна совпадать с меткой в начале блока — обычно используется в сложных сложенных конструкциях для подсказки человеку, какой блок завершается.
Любой оператор в выполняемой секции блока может быть вложенным блоком.
Вложенные блоки используются:
- для логической группировки нескольких операторов
- локализации области действия переменных для группы операторов
- автоматическое уничтожение локальных переменных при выходе из блока
- нельзя извне обратится к внутренней переменной
- для возможно ВЫХОДИТЬ из внутреннего блока на ЛЮБОЙ уровень выше
- не забывайте про отступы — чтобы было легче читать и понимать, когда закончится вложенный блок
Во время выполнения вложенного блока переменные, объявленные в нём, скрывают переменные внешних блоков с такими же именами. Чтобы получить доступ к внешним переменным, нужно дополнить их имена меткой блока.
Также мы можем дать метку основному блоку, чтобы было проще обращаться к его переменным. В следующем примере это будет out_block.
CREATE FUNCTION somefunc() RETURNS integer AS $$
<<out_block>>
DECLARE
quantity integer := 300;
BEGIN
RAISE NOTICE 'Сейчас quantity = %', quantity; -- Выводится 300
quantity := 500;
--
-- Вложенный блок
--
DECLARE
quantity integer := 800;
BEGIN
RAISE NOTICE 'Сейчас quantity = %', quantity; -- Выводится 800
RAISE NOTICE 'Во внешнем блоке quantity = %', out_block.quantity; -- Выводится 500
END;
RAISE NOTICE 'Сейчас quantity = %', quantity; -- Выводится 500
RETURN quantity;
END;
$$ LANGUAGE plpgsql;
Т.е. из вложенного блока можно обратится к внешнему, но не наоборот, потому что после выхода из внутреннего блока все переменные будут уничтожены.
Более подробные примеры можно посмотреть в видео.
В следующей теме мы рассмотрим операторы ветвления.
Добавить комментарий