Вот мои выводы на эту тему:
Это цитата из руководства:
"Вам необходим блок BEGIN / END, когда в процедуре содержится более одного оператора. Этот блок используется для включения нескольких операторов.
Но это еще не все. Блок BEGIN / END, также называемый составным оператором, - это место, где вы можете определить переменные и поток управления. "
Другими словами:
(Эти правила, похоже, применяются к триггерам и хранимым процедурам одинаково, так как кажется, что в обоих случаях используется один и тот же синтаксис.)
Во-первых, обратите внимание, что группа управления потоком ключевых слов, таких как IF ... END IF или WHILE ... END WHILE, рассматривается как единое утверждение в том, что касается его завершения точкой с запятой, то есть завершается в целом одной точкой с запятой в конце: IF ... END IF; WHILE ... END WHILE;.
Тогда, если тело триггера или хранимой процедуры содержит только один этап, и этот оператор не является ни объявлением переменной, ни группой управления потоком ключевых слов, как указано выше, этот оператор не может заканчиваться точкой с запятой (;) и не заключен в блок BEGIN ... END.
Напротив, если тело триггера или хранимой процедуры содержит более одного этапа, и особенно если оно содержит объявления переменных и / или группы управления потоками ключевых слов, то оно должно быть заключено в BEGIN ... END блок.
Наконец, сам блок BEGIN ... END не должен заканчиваться точкой с запятой.
Надеюсь, это поможет.