Понятие блока

Статья основана на шестом видео из 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;

Т.е. из вложенного блока можно обратится к внешнему, но не наоборот, потому что после выхода из внутреннего блока все переменные будут уничтожены.

Более подробные примеры можно посмотреть в видео.

В следующей теме мы рассмотрим операторы ветвления.


Опубликовано

в

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

3 × 3 =