Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > exception на курсор


Автор: tvik 15.11.2006, 15:54
Код
Cursor all_doc_id(param) is
     ..........................

FOR doc IN all_doc_id(land.cd_id) 
       LOOP 
     BEGIN
          doc_inserted := false; --просто переменная
          flag_exeption:=true;   --просто переменная      
                                                    
       exception when NO_DATA_FOUND then 
          begin                                     
           insert into storage_item_hdr (ITEM_ID,STATUS)
             values 
               (
               assetdb_seq.nextval,
              'AVAILABLE'
               );
           end; 
     END;

                                                           
 Подскажите пожалуйста, как сделать Exception на этот только цикл (если я делаю BEGIN перед FOR, то не работает правильно, если делать BEGIN после LOOP, то вылетает не видя ошибку)  smile 

Автор: 3x3 15.11.2006, 19:58
А что должно происходить?

А вообще, что делает код? Такое ощущение, что вы пытаетесь как-то хитро исполнить действие "вставить строку если она ещё не вставлена" и по выходе из цикла её отапдейтить?

Автор: tvik 16.11.2006, 12:24
Нет все проще, 
в цикле я открываю курсор - all_doc_id(land.cd_id) 

FOR doc IN all_doc_id(land.cd_id) 

если курсор не вернул ни одной строки, то выполняем особую вставку, иначе заходим в цикл.

Просто если возникиет ошибка NO_DATA_FOUND, то в моем случае она ее не видит, т.к.,  exception определен в цикле (по-моему) smile

Автор: LSD 16.11.2006, 12:34
Поставь в начало цикла:
Код
if (not cheked) and (doc%notfound) then
  -- do insert
  exit;
end if
cheked = true;

Автор: 3x3 16.11.2006, 14:43
Цитата(tvik @ 16.11.2006,  12:24)
Нет все проще, 
в цикле я открываю курсор - all_doc_id(land.cd_id) 

FOR doc IN all_doc_id(land.cd_id) 

Просто если возникиет ошибка NO_DATA_FOUND, то в моем случае она ее не видит, т.к.,  exception определен в цикле (по-моему) smile

NO_DATA_FOUND случилась бы при явном вызове SELECT xxx INTO yyy WHERE false_condition. 

Цитата

если курсор не вернул ни одной строки, то выполняем особую вставку, иначе заходим в цикл.


Это-то понятно. Но ответ на вопрос зачем так делать мог бы подсказать более другой путь решения.. А мог бы и нет smile

PS
Вообще-то если ситуация отражает логику программы, то это не исключение. Если нужно просто проверить наличие строки в базе, то для этого служат выражения вида: 
select count(1) into your_variable from table_name where your_condition and rownum=1
А вот если при исполнении этого кода случится что-то исключительное - например таблица из базы пропала, вот на тот случай и exception.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)