EXCEPTION Куда вставить?

sandysman
Дата: 30.11.2012 08:56:04
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?
Павел Воронцов
Дата: 30.11.2012 09:04:29
sandysman,

Ой. А что это вы сделать пытаетесь?
tru55
Дата: 30.11.2012 09:11:58
DECLARE
no_data_found EXCEPTION;

А это тут на кой?
Павел Воронцов
Дата: 30.11.2012 09:17:04
tru55,

Там много интересного еще дальше.
Ramin Hashimzade
Дата: 30.11.2012 09:20:28
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;


Мдааааа ...
sandysman
Дата: 30.11.2012 09:42:22
А есть разница что я пытаюсь сделать? все работает когда rownum=1 но если вставить 2,3,4 и т.д. или переменную shet то выдает ошибку, ну а для тех кто не понял беру два значения из каждой строки таблицы, к примеру первое 100 второе 132, и привожу второе число к 130, но проблема в selecte надо exceptoin или commit поставить.
Гхостик
Дата: 30.11.2012 09:47:39
Видимо, совсем новичок в программировании. Давай разберу ошибки.
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 (похожие имена) не информативны, разбираться в коде, написанном с таким именованием, очень неудобно.
Гхостик
Дата: 30.11.2012 09:50:13
sandysman
А есть разница что я пытаюсь сделать? все работает когда rownum=1 но если вставить 2,3,4 и т.д. или переменную shet то выдает ошибку, ну а для тех кто не понял беру два значения из каждой строки таблицы, к примеру первое 100 второе 132, и привожу второе число к 130, но проблема в selecte надо exceptoin или commit поставить.

update povishokl p
set p.PovOkl = round(PovOkl, -1)
Вячеслав Любомудров
Дата: 30.11.2012 09:50:27
Гхостик
3. where rownum=2 будет ориентироваться на сортировку запроса, которая в данном случае не определена. Т.е. можно сказать, что ты берешь случайную строку из таблицы.
А если строка всего одна?
Гхостик
Дата: 30.11.2012 09:57:54
Вячеслав Любомудров,

Тогда будет no_data_found.