Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> exception на курсор, исключительная ситуация на курсор 
:(
    Опции темы
tvik
Дата 15.11.2006, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 20.10.2006

Репутация: нет
Всего: нет



Код
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 
PM MAIL   Вверх
3x3
Дата 15.11.2006, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 261
Регистрация: 17.9.2006

Репутация: 2
Всего: 8



А что должно происходить?

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


--------------------
Зачем платить больше,
когда можно заплатить дважды?
PM   Вверх
tvik
Дата 16.11.2006, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 20.10.2006

Репутация: нет
Всего: нет



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

FOR doc IN all_doc_id(land.cd_id) 

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

Просто если возникиет ошибка NO_DATA_FOUND, то в моем случае она ее не видит, т.к.,  exception определен в цикле (по-моему) smile
PM MAIL   Вверх
LSD
Дата 16.11.2006, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



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



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
3x3
Дата 16.11.2006, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 261
Регистрация: 17.9.2006

Репутация: 2
Всего: 8



Цитата(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.

Это сообщение отредактировал(а) 3x3 - 16.11.2006, 14:48


--------------------
Зачем платить больше,
когда можно заплатить дважды?
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0595 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.