Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 первая строка запроса обрабатывается дважды  [new]
shrek79
Member

Откуда:
Сообщений: 2
Добрый день!
Вот процедура, которая выполняется 1 раз в месяц:

create or replace procedure upd
( rec_read in out number , rec_error in out number ) IS

error nz02.err%type;
szak zakaz.s_zak%type;
drep parm.d_rep%type;
ceh_sum number;
rread number;
rerror number;

CURSOR cur_row is
select kod_zak , nom_zak , ceh , uch , rbt
, round( ( norm * kol_vo / ed ),2) norm_nz
, nvl( razr ,0) razr , usr
from nz02 n
where n.err = 0
order by nom_nz
for update of err , d_err , d_rep;

BEGIN
rread := 0;
rerror := 0;
select d_rep into drep from parm where rownum <= 1;

FOR rec IN cur_row LOOP
error := 1;
rread := rread + 1;
select s_zak
into szak
from zakaz z
where z.kod_zak = rec.kod_zak
and z.nom_zak = rec.nom_zak;

if ( SQL%NOTFOUND ) then
error := -20; rerror := rerror + 1;
end if;
if ( szak = 1) then
error := -21; rerror := rerror + 1;
end if;
if error = 1 then
select nvl( sum( norm + norm_izm - fakt_sum ),0)
into ceh_sum
from norma n
where n.kod_zak = rec.kod_zak
and n.nom_zak = rec.nom_zak
and n.ceh = rec.ceh
;
if ( ceh_sum < rec.norm_nz - 2 ) then
error := -22; rerror := rerror + 1;
end if;
end if;

if error = 1 then
update norma n
set n.fakt_sum = n.fakt_sum + rec.norm_nz
, n.fakt_mes = n.fakt_mes + rec.norm_nz
, n.fakt_dek = n.fakt_dek + rec.norm_nz
where
n.kod_zak = rec.kod_zak
and n.nom_zak = rec.nom_zak
and n.uch = rec.uch
and n.rbt = rec.rbt;
if ( SQL%NOTFOUND ) then
insert into norma
( kod_zak , nom_zak , ceh , uch , rbt
, fakt_sum , fakt_mes , fakt_dek
, razr , usr )
values
( rec.kod_zak , rec.nom_zak , rec.ceh , rec.uch , rec.rbt
, rec.norm_nz , rec.norm_nz , rec.norm_nz
, rec.razr , rec.usr );
end if;
end if;
update nz02 n
set n.err = error
, n.d_err = sysdate
, n.d_rep = drep
where current of cur_row;
if ( SQL%NOTFOUND ) then
raise_application_error ( -20044, 'CHysh');
end if;
END LOOP;
rec_read := rread;
rec_error := rerror;
exception
when others then
raise_application_error
( -20040, to_char(sqlcode) ||':'|| sqlerrm);
end;

Происходит такой казус: первая строка курсора cur_row обрабатывается дважды, в итоге эта строка считается ошибочной, в поле err записывается значение -22 (это происходит не каждый месяц), а дальше строчки обрабатываются правильно.

Не могу понять в чем дело!!! Буду очень благодарна любой помощи!!!
30 сен 10, 12:31    [9529022]     Ответить | Цитировать Сообщить модератору
 Re: первая строка запроса обрабатывается дважды  [new]
comphead
Member

Откуда: Киев
Сообщений: 3390
shrek79,

используйте тес SRC для оформления кода
30 сен 10, 12:32    [9529045]     Ответить | Цитировать Сообщить модератору
 Re: первая строка запроса обрабатывается дважды  [new]
Добрый Э - Эх
Guest
shrek79
Добрый день!
Вот процедура, которая выполняется 1 раз в месяц:

create or replace procedure upd
 ( rec_read  in out number , rec_error  in out number )  IS
  
  error       nz02.err%type;
  szak        zakaz.s_zak%type;
  drep        parm.d_rep%type;
  ceh_sum     number;
  rread       number;
  rerror      number;
 
 CURSOR   cur_row    is
  select  kod_zak , nom_zak , ceh , uch , rbt
  ,       round( ( norm * kol_vo / ed ),2)  norm_nz
  ,       nvl( razr ,0) razr , usr
  from    nz02  n
  where   n.err   =  0
  order by  nom_nz
  for update of  err , d_err , d_rep;
  
BEGIN
  rread  := 0;
  rerror := 0;
  select  d_rep  into  drep  from  parm  where  rownum <= 1;
  
FOR  rec  IN  cur_row  LOOP
    error  := 1;
    rread  := rread + 1;
    select  s_zak
    into    szak
    from    zakaz  z
    where   z.kod_zak  = rec.kod_zak
    and     z.nom_zak  = rec.nom_zak;

    if    ( SQL%NOTFOUND )  then
      error := -20;    rerror := rerror + 1;
    end if;
    if ( szak = 1)  then
      error := -21;    rerror := rerror + 1;
    end if;
   if error = 1 then 
    select  nvl( sum( norm + norm_izm - fakt_sum ),0)
    into    ceh_sum
    from    norma  n
    where   n.kod_zak   =  rec.kod_zak
    and     n.nom_zak   =  rec.nom_zak
    and     n.ceh       =  rec.ceh
    ;
    if ( ceh_sum  <  rec.norm_nz - 2 )  then
      error  := -22;  rerror := rerror + 1;
    end if;
   end if;
   
   if error = 1 then
    update  norma  n
    set     n.fakt_sum  =  n.fakt_sum  +  rec.norm_nz
    ,       n.fakt_mes  =  n.fakt_mes  +  rec.norm_nz
    ,       n.fakt_dek  =  n.fakt_dek  +  rec.norm_nz
    where   
        n.kod_zak  = rec.kod_zak
    and     n.nom_zak  = rec.nom_zak
    and     n.uch      = rec.uch
    and     n.rbt      = rec.rbt;
    if    ( SQL%NOTFOUND )  then
      insert into  norma
      ( kod_zak  , nom_zak  , ceh , uch , rbt
      , fakt_sum , fakt_mes , fakt_dek
      , razr , usr )
       values
      ( rec.kod_zak , rec.nom_zak , rec.ceh , rec.uch , rec.rbt
      , rec.norm_nz  , rec.norm_nz  , rec.norm_nz
      , rec.razr , rec.usr );
    end if;
  end if;
update  nz02   n
   set     n.err    =  error
   ,       n.d_err  =  sysdate
   ,       n.d_rep  =  drep
   where   current of  cur_row;
    if    ( SQL%NOTFOUND )  then
     raise_application_error ( -20044, 'CHysh');
    end if;
 END LOOP;
  rec_read  := rread;
  rec_error := rerror;
exception
 when  others  then
  raise_application_error
   ( -20040, to_char(sqlcode) ||':'|| sqlerrm);
end;
Происходит такой казус: первая строка курсора cur_row обрабатывается дважды, в итоге эта строка считается ошибочной, в поле err записывается значение -22 (это происходит не каждый месяц), а дальше строчки обрабатываются правильно.

Не могу понять в чем дело!!! Буду очень благодарна любой помощи!!!
30 сен 10, 12:36    [9529080]     Ответить | Цитировать Сообщить модератору
 Re: первая строка запроса обрабатывается дважды  [new]
Хэнк
Member

Откуда: Днепропетровск
Сообщений: 115
shrek79,

Откуда такой странный вывод про первую строку ? Что возвращает запрос

  select n.kod_zak, n.nom_zak, n.ceh, n.norm_nz,
         nvl(sum(m.norm + m.norm_izm - m.fakt_sum ),0) ceh_sum
  from   nz02 n, norma m
  where  n.kod_zak = m.kod_zak
  and    n.nom_zak = m.nom_zak
  and    n.ceh = m.ceh
  group by n.kod_zak, n.nom_zak, n.ceh, n.norm_nz
  having nvl(sum(m.norm + m.norm_izm - m.fakt_sum ),0) < n.norm_nz - 2
30 сен 10, 14:30    [9530257]     Ответить | Цитировать Сообщить модератору
 Re: первая строка запроса обрабатывается дважды  [new]
-2-
Member

Откуда:
Сообщений: 15330
Что это?!!
    select  s_zak
    into    szak
    from    zakaz  z
    where   z.kod_zak  = rec.kod_zak
    and     z.nom_zak  = rec.nom_zak;

    if    ( SQL%NOTFOUND )  then
      error := -20;    rerror := rerror + 1;
    end if;
30 сен 10, 14:37    [9530357]     Ответить | Цитировать Сообщить модератору
 Re: первая строка запроса обрабатывается дважды  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18388
shrek79

    select  s_zak
    into    szak
    from    zakaz  z
    where   z.kod_zak  = rec.kod_zak
    and     z.nom_zak  = rec.nom_zak;

    if    ( SQL%NOTFOUND )  then
      error := -20;    rerror := rerror + 1;
    end if;
    if ( szak = 1)  then
      error := -21;    rerror := rerror + 1;
    end if;

Происходит такой казус: первая строка курсора cur_row обрабатывается дважды

1) про "обрабатывается дважды" - сами придумали или кто-то подсказал?
2) можете объяснить что именно Вы имели ввиду, написав выделенное?
30 сен 10, 14:57    [9530643]     Ответить | Цитировать Сообщить модератору
 Re: первая строка запроса обрабатывается дважды  [new]
shrek79
Member

Откуда:
Сообщений: 2
Всем большое спасибо!!! Вопрос снят
1 окт 10, 09:21    [9534564]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить