Видимо, совсем новичок в программировании. Давай разберу ошибки.
sandysman |
---|
DECLARE
Pov NUMBER;
Pov1 NUMBER;
Raznica NUMBER;
Raznica1 NUMBER;
Shet NUMBER;
KonecShota NUMBER;
no_data_found EXCEPTION;
begin
Shet:=1;
raznica1:=0;
Select count (*) into KonecShota from povishokl;
Loop
If Shet>KonecShota then exit;
end if;
Select povokl into Pov from povishokl where rownum=2;
Select oklstari into Pov1 from povishokl where rownum=2;
raznica:=Pov-Pov1;
if raznica>10 then
WHILE Raznica>10
loop
raznica1:=raznica1+1;
Raznica:=raznica-1;
end loop;
end if;
Pov:=Pov-raznica1;
Update Povishokl set PovOkl=Pov where rownum= 2;
Shet:=Shet+1;
end LOOP;
end;
вот код на select выдает ошибку data_no_found как сделать обработчик ошибок на select? |
1. no_data_found - стандартное исключение, определять его как свое не нужно.
2. Loop + проверка на выход из цикла в первую очередь лучше заменить на цикл типа while
3. where rownum=2 будет ориентироваться на сортировку запроса, которая в данном случае не определена. Т.е. можно сказать, что ты берешь случайную строку из таблицы. Когда хотят изменить одну запись, обычно ее ищут по первичному ключу.
4. 2 подряд select into из одного и того же запроса можно заменить на один select f1, f2 into v1, v2.
5. if прямо перед while с тем же условием избыточен (не нужен совсем).
6. чтобы отнять от одного числа другое, не нужно делать цикл, в котором отнимать по одному.
Гораздо лучше что-то вроде pov := greatest(pov1 - pov, 10) (я не разобрался до конца что от чего отнимается, тем более ошибки в цикле очень вероятны).
7. Чтобы перебрать все записи таблицы и изменить в них значения, не нужно делать цикл от 1 до count(*), нужно написать update без условий.
8. Имена переменных Raznica, Raznica1 (похожие имена) не информативны, разбираться в коде, написанном с таким именованием, очень неудобно.