У блока есть обязательная исполняемая часть
Блок объединяет связанные объявления и команды. Объявления могут располагаться после DECLARE, исполняемая часть начинается с BEGIN, а END завершает блок. Раздел обработки исключений после EXCEPTION является необязательным. Обязательна именно исполняемая часть; наличие всех перечисленных разделов не требуется для каждого примера. В объявлениях задаются переменные, их типы и при необходимости начальные значения. Для учебного расчёта можно представить три числовые переменные: количество предметов, вес одного предмета и общий вес. У каждой есть отдельное состояние. Понятные имена помогают читать замысел, но сами по себе не создают связи между значениями. Эту связь нужно выразить конкретной выполняемой командой.
Присваивание сохраняет вычисленное значение
Оператор := присваивает переменной значение выражения. Сначала вычисляется правая часть, затем результат записывается в левую. Типы должны быть совместимы. Присваивание не является математическим равенством, которое программа обязана непрерывно поддерживать при всех дальнейших изменениях. Пусть количество равно четырём, вес одного предмета равен трём условным единицам. После вычисления общего веса в соответствующей переменной находится двенадцать. Если затем количество изменить на шесть, общий вес пока останется двенадцать. Только повторное вычисление произведения запишет восемнадцать. Этот пример описывает значения обычных переменных внутри блока, а не автоматически пересчитываемые формулы электронной таблицы.
Отсутствующее значение нельзя считать нулём
Обычная переменная без заданного начального значения по умолчанию получает NULL. Это обозначение отсутствующего значения, а не число ноль. Поэтому прибавление единицы к неинициализированному числовому счётчику не превращает его автоматически в единицу: результат остаётся NULL. При чтении блока полезно отмечать состояние каждой переменной после каждой команды. Если исходных данных нет, сначала нужно решить, допустимо ли вычисление и какое поведение требуется по смыслу задачи. Механическая замена отсутствия нулём может скрыть проблему. Также обработка исключения не означает продолжение со следующей строкой внутри прерванной исполняемой части: обычное выполнение блока прекращается, управление передаётся соответствующему обработчику. Ошибки не стоит просто игнорировать ради видимости успешного завершения.
Попробуйте на практике
Проведите бумажную трассировку вымышленного расчёта общего веса. Подключение к базе, таблицы и выполнение команд не нужны.
- Нарисуйте три колонки для количества, веса одного предмета и общего веса. В начальной строке запишите четыре, три и отсутствие вычисленного результата.
- Во второй строке выполните произведение первых двух значений и запишите двенадцать в колонку общего веса. Остальные значения перенесите без изменения.
- В третьей строке измените только количество на шесть. Затем отдельной четвёртой строкой повторите вычисление произведения и отметьте, когда общий вес стал восемнадцать.
- Рассмотрите второй вариант, где начальный вес одного предмета отсутствует. Запишите ожидаемое отсутствие числового результата и сформулируйте вопрос о недостающих данных вместо подстановки произвольного нуля.
Как проверить результат. Между изменением количества и повторным вычислением общий вес остаётся двенадцать. Значение восемнадцать возникает только после нового присваивания. NULL не смешан с нулём, а каждая строка показывает состояние всех переменных.
Частые вопросы
Изменит ли такое присваивание данные таблицы?
Присваивание обычной локальной переменной меняет её значение в блоке. Изменение строк таблицы требует соответствующих операций с данными и отдельного понимания их последствий.
Почему правильные имена переменных не обеспечивают правильный результат?
Имя помогает человеку понимать назначение, но порядок вычислений задают команды. Поэтому полезно проверять не только формулу на бумаге, но и момент её выполнения относительно остальных присваиваний.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.