Всякий раз, когда вы можете выполнить обновление одним оператором, вы должны делать это вместо использования цикла. Таким образом вы получите очень большой прирост производительности; или, наоборот, обновления в цикле стоят вам большой производительности.
Если вам действительно нужно использовать цикл, конечно, вам нужно условие where, чтобы убедиться, что вы обновляете только ту запись, которую действительно хотите обновить. Возможный способ, который всегда работает (даже если нет доступного уникального ключа), состоит в использовании псевдостолбцы rowid:
begin
for i in (select rowid, emp.* from emp)
loop
if i.sal=1300 then
update emp
set sal=13000
where rowid=i.rowid;
end if;
end loop;
end;
Другой возможностью было бы использование явного курсора и синтаксиса "update ... where current of cursorname ".