Метки PL/SQL предназначены для присваивания имени определенной части программы. Синтаксис метки:
<<идентификатор>>
Здесь идентификатор — это допустимый идентификатор PL/SQL (длиной до 30 символов и начинающийся с буквы — см. статью в блогах про идентификаторы). Метка не имеет завершителя; она располагается непосредственно перед фрагментом кода, имя которого она определяет, даже если это простая команда NULL:
BEGIN ... <> NULL;
Поскольку анонимный блок представляет собой группу исполняемых команд, с помощью метки можно задать имя анонимного блока (на время его выполнения). Пример:
<> BEGIN INSERT INTO catalog VALUES (...); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN NULL; END insert_but_ignore_dups;
Блоки часто именуют для того, чтобы код лучше читался. Давая блоку имя, вы делаете код самодокументируемым. Заодно вы еще раз задумаетесь над тем, что он делает (иногда это даже помогает найти незамеченные ошибки). Метки используются также для уточнения ссылок на элементы внешнего блока, имена которых совпадают с именами текущего (вложенного) блока. Пример:
<> DECLARE counter INTEGER := 0; BEGIN ... DECLARE counter INTEGER := 1; BEGIN IF counter = outerblock.counter THEN ... END IF; END; END;
Без метки блока невозможно различить две переменные с одинаковыми именами counter (впрочем, проблема лучше решается присваиванием разных имен).
У меток также есть третья функция: они могут служить целевыми точками перехода для команд GOTO
Хотя некоторые программы, с которыми мне довелось работать, использовали метки, последняя функция меток важнее всех трех предыдущих вместе взятых: метка может использоваться в качестве целевой точки оператора выхода из вложенных циклов EXIT:
BEGIN <> LOOP LOOP EXIT outer_loop; END LOOP; команда; END LOOP; END;
Без метки <<outer_loop>> команда EXIT осуществит выход только из внутреннего цикла, после чего будет выполнена команда, что совершенно излишне. Итак, в данном случае метка позволяла реализовать функциональность, которую в PL/SQL было бы затруднительно реализовать другим способом.