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

Откуда:
Сообщений: 15
Добрый день.

Процедура:

create or replace procedure tov_type(
insider_num_ product_tab.insider_num%type,
err_mess out varchar2)
is

err_id number;
old_tp varchar2 (2);
new_tp varchar2(2);

begin

err_id := 0;
err_mess := '';

for d in (select ct.insider_num, ct.product_name, ct.int_type, ct.re_type
from product_tab ct
where ct.insider_num = insider_num_)
loop

if err_id = 0
then
for k in (select ct.insider_num, ct.product_name, ct.int_type, ct.re_type
from product_tab ct
where ct.insider_num = insider_num_)
loop
------------------------------------------------

for m in (select cc.old_type from change_type cc
where cc.old_type = k.int_type)
loop

if k.int_type not in (m.old_type)
then err_id := 1;
err_mess := 'Присутствует неизвестная маркировка продукции';
end if;
end loop;
-------------------------------------------------
end loop;
end if;



if err_id = 0
then
for g in (select ct.insider_num, ct.product_name, ct.int_type, ct.re_type
from product_tab ct
where ct.insider_num = insider_num_)
loop
old_tp := g.int_type;

for n in (select cc.old_type, cc.new_type from change_type cc
where cc.old_type = g.int_type)
loop

if g.int_type in (n.old_type)
then new_tp := n.new_type;
update product_tab ict set ict.int_type = new_tp, ict.re_type = new_tp where ict.product_name = g.product_name;
update producthist_tab dh set dh.int_type = new_tp where dh.product_name = g.product_name;
end if;
end loop;

insert into table_log
values(sysdate,'Изменение маркировки продукции: товар ' || g.product_name || ' (старое значение ' ||
old_tp || ' новое ' || new_tp || ')',user);

end loop;
end if;

end;

В участке выделенным ------ не работает проверка
В условии одному торговцу (insider_num) соответствует 5 товаров (product_name) в таблице (product_tab)
В таблице change_type находятся соотношения изменений с одной маркировки (old_type) продукции на другую (new_type)

Проблема заключается в том, что независимо от того есть ли хоть одна маркировка товара (из 5) несоответствующая таблице change_type или по всем товарам маркировки другие, ошибку не выдает и пытается выполнить update.
В случае когда все совпадения - то update осуществляется корректно.

Помогите решить проблему с ошибкой. Спс.
18 сен 14, 13:22    [16590255]     Ответить | Цитировать Сообщить модератору
 Re: неработает проверка в процедуре  [new]
oxygene_w
Member

Откуда:
Сообщений: 15
подкорректировал саму процедуру:

create or replace procedure tov_type(
insider_num_ product_tab.insider_num%type,
err_mess out varchar2)
is

err_id number;
old_tp varchar2 (2);
new_tp varchar2(2);

begin

err_id := 0;
err_mess := '';

for d in (select ct.insider_num, ct.product_name, ct.int_type, ct.re_type
from product_tab ct
where ct.insider_num = insider_num_)
loop

if err_id = 0
then
for k in (select ct.insider_num, ct.product_name, ct.int_type, ct.re_type
from product_tab ct
where ct.insider_num = insider_num_)
loop
------------------------------------------------

for m in (select cc.old_type from change_type cc
where cc.old_type = k.int_type)
loop

if k.int_type not in (m.old_type)
then err_id := 1;
err_mess := 'Присутствует неизвестная маркировка продукции';
end if;
end loop;
-------------------------------------------------
end loop;
end if;



if err_id = 0
then
for g in (select ct.insider_num, ct.product_name, ct.int_type, ct.re_type
from product_tab ct
where ct.insider_num = insider_num_)
loop
old_tp := g.int_type;

for n in (select cc.old_type, cc.new_type from change_type cc
where cc.old_type = g.int_type)
loop

if g.int_type in (n.old_type)
then new_tp := n.new_type;
update product_tab ict set ict.int_type = new_tp, ict.re_type = new_tp where ict.product_name = g.product_name;
update producthist_tab dh set dh.int_type = new_tp where dh.product_name = g.product_name;
end if;
end loop;

insert into table_log
values(sysdate,'Изменение маркировки продукции: товар ' || g.product_name || ' (старое значение ' ||
old_tp || ' новое ' || new_tp || ')',user);

end loop;
end if;

end;
18 сен 14, 13:26    [16590294]     Ответить | Цитировать Сообщить модератору
 Re: неработает проверка в процедуре  [new]
oxygene_w
Member

Откуда:
Сообщений: 15
create or replace procedure tov_type(
insider_num_ product_tab.insider_num%type,
err_mess out varchar2)
is

err_id number;
old_tp varchar2 (2);
new_tp varchar2(2);

begin

err_id := 0;
err_mess := '';

if err_id = 0
then
for k in (select ct.insider_num, ct.product_name, ct.int_type, ct.re_type
from product_tab ct
where ct.insider_num = insider_num_)
loop
------------------------------------------------

for m in (select cc.old_type from change_type cc
where cc.old_type = k.int_type)
loop

if k.int_type not in (m.old_type)
then err_id := 1;
err_mess := 'Присутствует неизвестная маркировка продукции';
end if;
end loop;
-------------------------------------------------
end loop;
end if;



if err_id = 0
then
for g in (select ct.insider_num, ct.product_name, ct.int_type, ct.re_type
from product_tab ct
where ct.insider_num = insider_num_)
loop
old_tp := g.int_type;

for n in (select cc.old_type, cc.new_type from change_type cc
where cc.old_type = g.int_type)
loop

if g.int_type in (n.old_type)
then new_tp := n.new_type;
update product_tab ict set ict.int_type = new_tp, ict.re_type = new_tp where ict.product_name = g.product_name;
update producthist_tab dh set dh.int_type = new_tp where dh.product_name = g.product_name;
end if;
end loop;

insert into table_log
values(sysdate,'Изменение маркировки продукции: товар ' || g.product_name || ' (старое значение ' ||
old_tp || ' новое ' || new_tp || ')',user);

end loop;
end if;

end;
18 сен 14, 13:28    [16590309]     Ответить | Цитировать Сообщить модератору
 Re: неработает проверка в процедуре  [new]
ora601
Member

Откуда:
Сообщений: 750
oxygene_w,

not in (nvl(m.old_type,'SOME VALUE')) 
18 сен 14, 13:28    [16590317]     Ответить | Цитировать Сообщить модератору
 Re: неработает проверка в процедуре  [new]
oxygene_w
Member

Откуда:
Сообщений: 15
ora601,

тоже самое, не работает
18 сен 14, 13:42    [16590436]     Ответить | Цитировать Сообщить модератору
 Re: неработает проверка в процедуре  [new]
ora601
Member

Откуда:
Сообщений: 750
oxygene_w
ora601,

тоже самое, не работает


Что то я не посмотрел на твой код :)
Как оно может "работать" если у тебя курсор
select cc.old_type from change_type cc
where cc.old_type = k.int_type
18 сен 14, 14:01    [16590569]     Ответить | Цитировать Сообщить модератору
 Re: неработает проверка в процедуре  [new]
stax..
Guest
oxygene_w,
взможно Вам надо шото такое
...
for k in (select ct.insider_num, ct.product_name, ct.int_type, ct.re_type
 from product_tab ct
 where ct.insider_num = insider_num_
     and not exists
        (select cc.old_type 
         from change_type cc
         where cc.old_type = ct.int_type)
      )
   err_id := 1;
   exit;
end loop;
....


.....
stax
18 сен 14, 14:47    [16590867]     Ответить | Цитировать Сообщить модератору
 Re: неработает проверка в процедуре  [new]
oxygene_w
Member

Откуда:
Сообщений: 15
ora601,

честно говоря я с курсорами никогда не работал и не совсем понимаю что имеется ввиду :(
но в части где осуществляется update ведь тооже стоит данный цикл и там все "работает" ?!
18 сен 14, 17:00    [16591713]     Ответить | Цитировать Сообщить модератору
 Re: неработает проверка в процедуре  [new]
oxygene_w
Member

Откуда:
Сообщений: 15
stax..,

Переделал следующим образом, вроде все правильно работает :) :

   if err_id = 0
     then
           for k in (select ct.insider_num, ct.product_name, ct.int_type, ct.re_type
                     from product_tab ct
                     where ct.insider_num = insider_num_
                           and not exists (select 1 from change_type cc
                                           where cc.old_type = ct.int_type)
                     )
           loop      
     ------------------------------------------------
                               
                    if k.int_type is not null        
                     then err_id := 1;
                          err_mess := 'Присутствует неизвестная маркировка продукции';
                          end if;

     -------------------------------------------------  
    end loop;      
    end if;
18 сен 14, 17:02    [16591719]     Ответить | Цитировать Сообщить модератору
 Re: неработает проверка в процедуре  [new]
stax..
Guest
oxygene_w
stax..,

Переделал следующим образом, вроде все правильно работает :) :

   if err_id = 0
     then
           for k in (select ct.insider_num, ct.product_name, ct.int_type, ct.re_type
                     from product_tab ct
                     where ct.insider_num = insider_num_
                           and not exists (select 1 from change_type cc
                                           where cc.old_type = ct.int_type)
                     )
           loop      
     ------------------------------------------------
                               
                    if k.int_type is not null        
                     then err_id := 1;
                          err_mess := 'Присутствует неизвестная маркировка продукции';
                          end if;

     -------------------------------------------------  
    end loop;      
    end if;

я б убрал if
            where ct.insider_num = insider_num_
                           and int_type is not null
                           and not exists (select 1 from change_type cc
                                           where cc.old_type = ct.int_type)
                     )
           loop      
     ------------------------------------------------
                               
                          err_id := 1;
                          err_mess := 'Присутствует неизвестная маркировка продукции';
                          exit;

     -------------------------------------------------  
    end loop;      
18 сен 14, 17:55    [16592013]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить