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

Откуда:
Сообщений: 26
Помогите разобраться с pl-ми исключениями. Если в таблице base.concat_oc_on не находится
значение, то вылетает исключение, которое пока не получается перехватить, а хотелось бы цикл продолжить))
cursor incom
    is
        select lic_nom, raion, post_ot, f_i_o, indekc, gorod, proezd, dom, korp, kv, payment, summa, period, code_dep
            from pf_s_gor_con ;   
begin
  
  for inc in incom   loop
     begin
         select c.sys_key_number, c.n_raion, c.post_ot, c.f_i_o, c.gorod, c.proezd, c.dom, c.korp, c.kv 
         into sysk, c_raion, c_post_ot, c_f_i_o, c_gorod, c_proezd, c_dom, c_korp, c_kv  
         from base.concat_oc_on c 
         where c.pers_no = inc.lic_nom;  -- в случае если нет в таблице такого значения 

          exception                           
          when  NO_DATA_FOUND
          then 
               err:='Y';
          when OTHERS
         then
               err:='Y';
         end; 
    -------------------------------
    -----      Тело цикла
    -------------------------------
  end loop;
end;

20 сен 10, 16:32    [9468880]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений, как не выйти из цикла?  [new]
comphead
Member

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

сделайте вложенный
begin-end
20 сен 10, 16:35    [9468904]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений, как не выйти из цикла?  [new]
Серафимный Шестикрыл
Member [заблокирован]

Откуда: С луны свалился
Сообщений: 2922
Shinkonsen
Помогите разобраться с pl-ми исключениями. Если в таблице base.concat_oc_on не находится
значение, то вылетает исключение, которое пока не получается перехватить, а хотелось бы цикл продолжить))


1) А это что такое, если не перехват NO_DATA_FOUND во вложенном блоке ?

          exception                           
          when  NO_DATA_FOUND
          then 
               err:='Y';

2) За это надо отрывать Фаберже

          exception                           
          when  OTHERS
          then 
               err:='Y';


3) На кой черт тут цикл по курсору ?

P.S. Вы делением размножаетесь, что ли ? Как бактерии, каждые 40 минут ?
20 сен 10, 16:41    [9468955]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений, как не выйти из цикла?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Shinkonsen,

заменили бы ваш select into на курсорный цикл
20 сен 10, 16:42    [9468979]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений, как не выйти из цикла?  [new]
Shinkonsen
Member

Откуда:
Сообщений: 26
Вложенный begin - end вроде бы есть, просто неправильно табуляцию расставил.
cursor incom
    is
        select lic_nom, raion, post_ot, f_i_o, indekc, gorod, proezd, dom, korp, kv, payment, summa, period, code_dep
            from pf_s_gor_con ;   
begin
  
  for inc in incom   loop
     begin --begin
         select c.sys_key_number, c.n_raion, c.post_ot, c.f_i_o, c.gorod, c.proezd, c.dom, c.korp, c.kv 
         into sysk, c_raion, c_post_ot, c_f_i_o, c_gorod, c_proezd, c_dom, c_korp, c_kv  
         from base.concat_oc_on c 
         where c.pers_no = inc.lic_nom;  -- в случае если нет в таблице такого значения 

          exception                           
          when  NO_DATA_FOUND
          then 
               err:='Y';
          when OTHERS
         then
               err:='Y';
    end; -- end
    -------------------------------
    -----      Тело цикла
    -------------------------------
  end loop;
end;

[/quot]
20 сен 10, 16:45    [9469024]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений, как не выйти из цикла?  [new]
Shinkonsen
Member

Откуда:
Сообщений: 26
Многоуважаемый, Серафимный Шестикрыл,
выражайтесь по спокойнее.
Этот блок для этого и писался, но в результате не отрабатывается.
 exception                           
          when  NO_DATA_FOUND
          then 
               err:='Y';
Функция не дописана, поэтому просто стоят заглушки.
      exception                           
          when  OTHERS
          then 
               err:='Y';

>3) На кой черт тут цикл по курсору ?
вы можете предложить что-то более гибкое?
20 сен 10, 16:52    [9469120]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений, как не выйти из цикла?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
Shinkonsen
вылетает исключение

Какое исключение?
Протокол из окна sql*plus в студию.
20 сен 10, 16:58    [9469199]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений, как не выйти из цикла?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
Собственно, попробую угадать:
Если exception - NO_DATA_FOUND, то летит из "тела цикла", а не из select into.
Его легко получить и без sql при обращении к элементу коллекции по несуществующему индексу.
20 сен 10, 17:01    [9469230]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений, как не выйти из цикла?  [new]
Серафимный Шестикрыл
Member [заблокирован]

Откуда: С луны свалился
Сообщений: 2922
Shinkonsen
Многоуважаемый, Серафимный Шестикрыл,
выражайтесь по спокойнее.


Отличное предложение руководителю саппорта, каждый день разгребающего подобные перлы.

Shinkonsen

Этот блок для этого и писался, но в результате не отрабатывается.
 exception                           
          when  NO_DATA_FOUND
          then 
               err:='Y';


В чем это выражается ? В подвале стоит странный стук ?

Shinkonsen

Функция не дописана, поэтому просто стоят заглушки.
      exception                           
          when  OTHERS
          then 
               err:='Y';


Это еще один агрумент в пользу ампутации Фаберже - я пять суток назад услышал примерно
такой же аргумент от твоих индийских братьев по безумию, когда их перл угодил на продакшн.

Shinkonsen

>3) На кой черт тут цикл по курсору ?
вы можете предложить что-то более гибкое?


Могу. Напрашивается OUTER JOIN с изменением логики обработки и безо всяких
EXCEPTIONS или как выше посоветовал orawish - еше один FOR LOOP.
Но любые изменения можно рекомендовать только после того, как станет ясно, возможно
ли возникновение например TOO_MANY_ROWS.
20 сен 10, 17:05    [9469285]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений, как не выйти из цикла?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
Серафимный Шестикрыл
возможно ли возникновение например TOO_MANY_ROWS.

Этот суслик не там где его ищет автор :)
20 сен 10, 17:08    [9469319]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений, как не выйти из цикла?  [new]
Серафимный Шестикрыл
Member [заблокирован]

Откуда: С луны свалился
Сообщений: 2922
andrey_anonymous

Этот суслик не там где его ищет автор :)


Гыы. Прозреваю, что нам не все поведали и там целые слоны топчутся.
20 сен 10, 17:11    [9469346]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений, как не выйти из цикла?  [new]
Shinkonsen
Member

Откуда:
Сообщений: 26
Серафимный Шестикрыл,


Shinkonsen

Этот блок для этого и писался, но в результате не отрабатывается.
 exception                           
          when  NO_DATA_FOUND
          then 
               err:='Y';

В чем это выражается ? В подвале стоит странный стук ?

Ставим два брекпоинта, на селекте и после. Исключение вылетает на селекте.

Shinkonsen

Функция не дописана, поэтому просто стоят заглушки.
      exception                           
          when  OTHERS
          then 
               err:='Y';


Это еще один агрумент в пользу ампутации Фаберже - я пять суток назад услышал примерно
такой же аргумент от твоих индийских братьев по безумию, когда их перл угодил на продакшн.

Готов выслушать конструктивную критику почему так делать нельзя в тестовом режиме? На PL программирую 3й месяц, поэтому всех тонкостей не знаю, поэтому и обращаюсь к сообществу. И постарайтесь выражаться по мягче, иначе складывается ощущение, что этот форум единственное место, где вы можете помериться своими Фаберже.

Shinkonsen

>3) На кой черт тут цикл по курсору ?
вы можете предложить что-то более гибкое?


Могу. Напрашивается OUTER JOIN с изменением логики обработки и безо всяких
EXCEPTIONS или как выше посоветовал orawish - еше один FOR LOOP.
Но любые изменения можно рекомендовать только после того, как станет ясно, возможно
ли возникновение например TOO_MANY_ROWS.


TOO_MANY_ROWS возможно.
21 сен 10, 10:49    [9472462]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений, как не выйти из цикла?  [new]
SQLap
Member [заблокирован]

Откуда:
Сообщений: 34063
Shinkonsen
Готов выслушать конструктивную критику почему так делать нельзя в тестовом режиме?


Потому что ты на горло своему тестовому режиму наступаешь. Вместо того, чтобы узнавать, что именно вызвало ошибку, ты везде будешь получать ответ Y.
21 сен 10, 10:56    [9472529]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений, как не выйти из цикла?  [new]
-2-
Member

Откуда:
Сообщений: 15330
Shinkonsen
Серафимный Шестикрыл
В чем это выражается ? В подвале стоит странный стук ?
Ставим два брекпоинта, на селекте и после. Исключение вылетает на селекте.
Невозможно объяснить проблему, будучи настолько тупым, что даже теги форума криво расставил.
"брекпоинта" - дебаг перехватываешь exception'ами в коде?
21 сен 10, 11:01    [9472577]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений, как не выйти из цикла?  [new]
Серафимный Шестикрыл
Member [заблокирован]

Откуда: С луны свалился
Сообщений: 2922
Shinkonsen
Ставим два брекпоинта, на селекте и после. Исключение вылетает на селекте.


Ох, мля... Опять - аки паки иже херувимы.
Чего именно тебе не хватает, чтобы продемонстрировать тестовый пример -
мозгов или пальцев рук ?


Готов выслушать конструктивную критику почему так делать нельзя в тестовом режиме? На PL программирую 3й месяц, поэтому всех тонкостей не знаю, поэтому и обращаюсь к сообществу. И постарайтесь выражаться по мягче, иначе складывается ощущение, что этот форум единственное место, где вы можете помериться своими Фаберже.


Во-первых, уясни, что "помягче" пишется вместе по правилам русского языка.

Во-вторых, уясни, что есть документация.

В-третьих, уясни, что прежде чем использовать какую-то конструкцию, нужно
ознакомиться с правилами ее применения прочитав форумы и блоги уважаемых в
том самом сообществе людей, например Тома Кайта.

В-четвертых, какую пользу ты собираешься извлечь из подмены диагностической
информации, выдаваемой Oracle случае исключения на идиотский флажок 'Y' ?

В-пятых, речь идет не об измерении диаметра, а о лишении возможности производить
генетический мусор всяких особей, не желающих пользоваться своим мозгом.

Shinkonsen

TOO_MANY_ROWS возможно.


Во-во, что и требовалось доказать.
Фаберже тебе ни к чему.
21 сен 10, 11:29    [9472870]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений, как не выйти из цикла?  [new]
Shinkonsen
Member

Откуда:
Сообщений: 26
Серафимный Шестикрыл,

похоже вы в свое время свои Фаберже так и не уберегли.
21 сен 10, 12:00    [9473206]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений, как не выйти из цикла?  [new]
Серафимный Шестикрыл
Member [заблокирован]

Откуда: С луны свалился
Сообщений: 2922
Shinkonsen

похоже вы в свое время свои Фаберже так и не уберегли.


Сынок,
ты не вполне ясно уясняешь ситуацию.

Гавнокод, за который саппорт размажет твои фаберже по сковородке, произвел - ты.
Субъект, который неспособен ни толком объяснить проблему, ни привести тестовый
пример второй день подряд - ты.
Субъект, не понимающий что TOO_MANY_ROWS в неявном курсоре - это как минимум
повод задуматься над бизнес-логикой или чистотой данных - ты.
Младенец, размазывающий здесь сопли обиды, вместо того чтобы броситься со всех ног
гуглить по ключевым словам WHEN OTHERS THEN и читать документацию,
запихнув свои подростковые амбиции к себе в попу - ты.

Словом, хочешь быть идиотом - продолжай им быть.
21 сен 10, 12:11    [9473292]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений, как не выйти из цикла?  [new]
andrey_anonymous
Member

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

Ставим два брекпоинта, на селекте и после. Исключение вылетает на селекте.


А Вы полагали, что when others магически сделает так, что исключение не будет подниматься select into?
Нет.
Блок exceptions перехватывает.

Вот что просит от Вас уважаемое собрание уже который пост:
set echo on
set serveroutput on
declare
  l_str varchar2(32 char);
  cursor incom
    is  select rownum rn
          from all_objects
         where rownum < 10;
begin
  for inc in incom   loop
    dbms_output.put_line('going to process row '||inc.rn);
    begin
      select dummy
        into l_str
        from dual
       where rownum = inc.rn;
     exception
       when  NO_DATA_FOUND
         then
         dbms_output.put_line('When-no-data-found handler: '||sqlerrm);
         dbms_output.put_line('When-no-data-found handler: '||dbms_utility.format_error_backtrace);
         dbms_output.put_line('When-no-data-found handler: exception processed, continue cycle');
     end; -- end
    -------------------------------
    -----      Тело цикла
    -------------------------------
    dbms_output.new_line;
    -- А а вот на 5-й итерации вылетит птичка...
    if (inc.rn > 4) then
			raise no_data_found;
		end if;
    dbms_output.put_line('row '||inc.rn||' processed.');
    dbms_output.put_line('---------------------------');
  end loop;
end;
/
 
going to process row 1
 
row 1 processed.
---------------------------
going to process row 2
When-no-data-found handler: ORA-01403: no data found
When-no-data-found handler: ORA-06512: at line 12

When-no-data-found handler: exception processed, continue cycle
 
row 2 processed.
---------------------------
going to process row 3
When-no-data-found handler: ORA-01403: no data found
When-no-data-found handler: ORA-06512: at line 12

When-no-data-found handler: exception processed, continue cycle
 
row 3 processed.
---------------------------
going to process row 4
When-no-data-found handler: ORA-01403: no data found
When-no-data-found handler: ORA-06512: at line 12

When-no-data-found handler: exception processed, continue cycle
 
row 4 processed.
---------------------------
going to process row 5
When-no-data-found handler: ORA-01403: no data found
When-no-data-found handler: ORA-06512: at line 12

When-no-data-found handler: exception processed, continue cycle
 
 

ORA-01403: no data found
ORA-06512: at line 29
 
SQL> 

Обратите внимение, что обработано 4 строки из 9, в процессе обработки 5-й случилось аж два exception:первое было погашено в exception-блоке (я для Вас его напечатал), второе - случилось в теле цикла, где не было перехватчика и вылетело до user-level
21 сен 10, 13:11    [9473907]     Ответить | Цитировать Сообщить модератору
 Re: Обработка исключений, как не выйти из цикла?  [new]
Shinkonsen
Member

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

Большое спасибо за развернутый ответ, за одно и с генерацией исключений стало яснее)
21 сен 10, 14:59    [9475214]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить