Oracle PL / SQL - Являются ли исключения NO_DATA_FOUND плохими для выполнения хранимых процедур? - PullRequest
24 голосов
/ 21 октября 2008

Я пишу хранимую процедуру, в которой должно быть много условий. Обладая общими знаниями кодирования на C # .NET о том, что исключения могут снизить производительность, я всегда избегал их использования и в PL / SQL. Моя обусловленность в этом сохраненном процессе в основном вращается вокруг того, существует ли запись, что я мог бы сделать одним из двух способов:

SELECT COUNT(*) INTO var WHERE condition;
IF var > 0 THEN
   SELECT NEEDED_FIELD INTO otherVar WHERE condition;
....

-или-

SELECT NEEDED_FIELD INTO var WHERE condition;
EXCEPTION
WHEN NO_DATA_FOUND
....

Второй случай кажется мне более элегантным, потому что тогда я могу использовать NEEDED_FIELD, который мне пришлось бы выбрать в первом операторе после условия в первом случае. Меньше кода. Но если хранимая процедура будет работать быстрее с использованием COUNT (*), я не возражаю, если наберу немного больше, чтобы увеличить скорость обработки.

Есть намеки? Я упускаю другую возможность?

EDIT Я должен был упомянуть, что все это уже вложено в цикл FOR LOOP. Не уверен, имеет ли это значение при использовании курсора, так как я не думаю, что смогу ОБЪЯВИТЬ курсор как выбор в FOR LOOP.

Ответы [ 12 ]

0 голосов
/ 18 декабря 2008

вам не нужно использовать open, когда вы используете для циклов.

declare
cursor cur_name is  select * from emp;
begin
for cur_rec in cur_name Loop
    dbms_output.put_line(cur_rec.ename);
end loop;
End ;

или

declare
cursor cur_name is  select * from emp;
cur_rec emp%rowtype;
begin
Open cur_name;
Loop
Fetch cur_name into  Cur_rec;
   Exit when cur_name%notfound;
    dbms_output.put_line(cur_rec.ename);
end loop;
Close cur_name;
End ;
0 голосов
/ 21 октября 2008

Может быть, здесь бьют мертвую лошадь, но я поставил метку курсора для цикла, и он работал примерно так же, как метод no_data_found:

declare
  otherVar  number;
begin
  for i in 1 .. 5000 loop
     begin
       for foo_rec in (select NEEDED_FIELD from t where cond = 0) loop
         otherVar := foo_rec.NEEDED_FIELD;
       end loop;
       otherVar := 0;
     end;
   end loop;
end;

Процедура PL / SQL успешно завершена.

Прошло: 00: 00: 02.18

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...