Когда вы хотите обрабатывать исключения локально, как это:
begin
for emp_rec in (select * from emp) loop
begin
my_proc (emp_rec);
exception
when some_exception then
log_error('Failed to process employee '||emp_rec.empno);
end;
end loop;
end;
В этом примере исключение обрабатывается, а затем мы продолжаем и обрабатываем следующего сотрудника.
Другое использование - объявление локальных переменных с ограниченной областью действия, например:
declare
l_var1 integer;
-- lots of variables
begin
-- lots of lines of code
...
for emp_rec in (select * from emp) loop
declare
l_localvar integer := 0;
begin
-- Use l_localvar
...
end
end loop;
end;
Имейте в виду, что желание сделать это часто является признаком того, что ваша программа слишком велика и должна быть разбита:
declare
l_var1 integer;
-- lots of variables
...
procedure local_proc (emp_rec emp%rowtype):
l_localvar integer := 0;
begin
-- Use l_localvar
...
end
begin
-- lots of lines of code
...
for emp_rec in (select * from emp) loop
local_proc (emp_rec);
end loop;
end;