Сегодня пессимизм в настроении :(

Поэтому будем о плохом.

Наверное надо перечитать документацию (концепции и прочее по Oracle 11g), может что изменилось, и гуру, приближенные к исходникам базы рекомендуют писать код иначе.
Итак, начнем.

Кто научил писать в PL/SQL так:

select count(*)
into cnt
from <таблица / список таблиц>
where <различные условия>;

if cnt > 0
then
…..
else
…..
end if;

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

declare
cursor c_sel is
select 1
from <таблица / список таблиц>
where <различные условия>;
tmp_n number;
begin
Open c_sel;
Fetch c_sel into tmp_n;
if c_sel%Found
then
Close c_sel;
....
else
Close c_sel;
....
end if;
end;

И зачем нам число строк, если надо только признак есть-нет записи.
Можно ведь использовать и exists. Зачем всю таблицу перебирать; а если там миллионы строк, а не пару сотен тестовых 🙂

Потом получается

почему у меня формирование документа идет 2-3 минуты, вместо 10 секунд

обработка данных занимает 20 минут

ну и в том же духе…

Leave a Reply

Your email address will not be published. Required fields are marked *