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

Откуда:
Сообщений: 33
Здравствуйте, Господа профессионалы

Проблема:
Немогу вернуться после исключения обратно на то место откуда на него послали

Суть:
У меня большая процедура в ней много чего делается.
в том числе выполняется SELECT INTO из таблицы в строковую переменную, а если таблица пустая, срабатывает EXCEPTION где в переменную ложится значение 'Неизвестно',
после этого процедура завершается, а нужно продолжит ее выполнение после SELECT INTO.

Вопрос: Как вернутся после исключения и продолжить выполнение процедуры
29 мар 07, 10:22    [3954299]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуться  [new]
Elic
Member

Откуда:
Сообщений: 29980
Кирилл Тарабокио
Как вернутся после исключения и продолжить выполнение процедуры
Не надо никуда "возвращаться". Надо в правильном месте обрабатывать исключения.
RTFM Handling Raised PL/SQL Exceptions, Continuing after an Exception Is Raised (FAQ)
29 мар 07, 10:28    [3954330]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуться  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
BEGIN
.....

  BEGIN
    SELECT INTO...
  EXCEPTION

  END;
..... 
END;
29 мар 07, 10:28    [3954331]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуться  [new]
arhey
Member

Откуда: Санкт-Петербург. Россия... :)
Сообщений: 221
обернуть ее


begin
  -- ваш select into 
exception
when NO_DATA_FOUND then 
  -- что хотите.
end;

и вообще почитать про транзакции в oracle.
сейчас наверняка кто-нибудь даст ссылку
29 мар 07, 10:28    [3954332]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуться  [new]
Elic
Member

Откуда:
Сообщений: 29980
arhey
и вообще почитать про транзакции в oracle.
Ты бы сперва подумал :)
29 мар 07, 10:36    [3954385]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуться  [new]
arhey
Member

Откуда: Санкт-Петербург. Россия... :)
Сообщений: 221
Elic
arhey
и вообще почитать про транзакции в oracle.
Ты бы сперва подумал :)


Так и знал, что прицепишься, но вообще я подумал.
Речь идет о неявных установках Savepoint ов, что и позволяет откатывать не всю процедуру, а только до момента когда мы ее окружаем begin .. end.

А если речь о Savepoint, то речь явно о транзакциях.
29 мар 07, 10:45    [3954449]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуться  [new]
arhey
Member

Откуда: Санкт-Петербург. Россия... :)
Сообщений: 221
в догонку.
тот же Кайт, если мне не изменяет память описывает работу с перехватом ошибок именно в главе про транзакции (Oracle для профессионалов.)

даже цитату приведу.. :))
Кайт Глава 4
Имитируя автоматически выполняемые сервером Oracle действия с помощью опера-
тора SAVEPOINT, мы можем восстановить исходное поведение процедуры и при этом
перехватывать и "игнорировать" ошибки.
29 мар 07, 10:48    [3954471]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуться  [new]
Кирилл Тарабокио
Member

Откуда:
Сообщений: 33
Это все хорошо и я пытался делать EXCEPTION сразу после SELECT INTO как вы и предлагаете, но у меня несколько этих SELECT INTO и получается что нужно делать EXCEPTION для каждого
29 мар 07, 10:52    [3954496]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуться  [new]
arhey
Member

Откуда: Санкт-Петербург. Россия... :)
Сообщений: 221
да. именно так и получается.
иначе как Oracle узнает, куда вы хотите откатится при неудаче оператора.
29 мар 07, 10:53    [3954504]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуться  [new]
Elic
Member

Откуда:
Сообщений: 29980
arhey
Речь идет о неявных установках Savepoint ов, что и позволяет откатывать не всю процедуру
Какие точки, какие откаты? Чего ты себе выдумываешь?
29 мар 07, 11:18    [3954695]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуться  [new]
__vvp_
Member

Откуда: Санкт-Петербург
Сообщений: 1158
А если вообще избежать EXCEPTION?
v := null;
for i in (select f
          from t
          where ...)
loop
  v := i.f;
end loop; 

if v is not null then ....
else ...
29 мар 07, 13:46    [3955887]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуться  [new]
arhey
Member

Откуда: Санкт-Петербург. Россия... :)
Сообщений: 221
Ну ты же будешь рассказывать о том, что работа с базой в PL/SQL совершается вне текущей транзакции ?

вот эти вот точки
PL/SQL User's Guide and Reference Release 2 (9.2)
6 Interaction Between PL/SQL and Oracle
Statement-Level Rollbacks

Before executing a SQL statement, Oracle marks an implicit savepoint. Then, if the statement fails, Oracle rolls it back automatically. For example, if an INSERT statement raises an exception by trying to insert a duplicate value in a unique index, the statement is rolled back. Only work started by the failed SQL statement is lost. Work done before that statement in the current transaction is kept.


вот эти вот откаты
PL/SQL User's Guide and Reference Release 2 (9.2)
6 Interaction Between PL/SQL and Oracle
How Oracle Does Implicit Rollbacks

Before executing an INSERT, UPDATE, or DELETE statement, Oracle marks an implicit savepoint (unavailable to you). If the statement fails, Oracle rolls back to the savepoint. Normally, just the failed SQL statement is rolled back, not the whole transaction. However, if the statement raises an unhandled exception, the host environment determines what is rolled back.
29 мар 07, 13:51    [3955931]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуться  [new]
__vvp_
Member

Откуда: Санкт-Петербург
Сообщений: 1158
Поправка :)

А если вообще избежать EXCEPTION эмулировать SELECT INTO..?

v := null;
for i in (select f
          from t
          where ...)
loop
  v := i.f;

  EXIT;

end loop; 

if v is not null then ....
else ...
29 мар 07, 13:57    [3955975]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуться  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
Дык речь же шла о SELECT INTO...
29 мар 07, 13:57    [3955979]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуться  [new]
Elic
Member

Откуда:
Сообщений: 29980
arhey
вот эти вот точки, вот эти вот откаты
Ты можешь цитировать тонны доки, но пока что это всё никак не связано с темой :)
Hint: попробуй найти в вопросе хоть что-нибудь, что даст тебе моральное право распинаться про Statement-Level Rollback
29 мар 07, 13:59    [3955991]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуться  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
__vvp_
Поправка :)

А если вообще избежать EXCEPTION эмулировать SELECT INTO..?

v := null;
for i in (select f
          from t
          where ...)
loop
  v := i.f;

  EXIT;

end loop; 

if v is not null then ....
else ...


Хех...
1. если выбирается только одна строка, зачем EXIT ?
2. если может выбраться несколько, а тебе нужна первая, то м.б. проще?
OPEN C1;
FETCH C1 INTO v;
CLOSE C1;
29 мар 07, 14:00    [3955997]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуться  [new]
_spy_
Member

Откуда: Москва
Сообщений: 826
__vvp_
А если вообще избежать EXCEPTION

Во-первых, по вашему коду не будет ясно, вернул ли запрос 0 строк либо считанное значение поля есть NULL. Но дело не в этом, а в том, что зачем усложнять себе жизнь громадьем кода, если для этого и существуют исключения, чтобы их перехватывать и обрабатывать?
29 мар 07, 14:02    [3956014]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуться  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
_spy_
__vvp_
А если вообще избежать EXCEPTION

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


Ну вообще-то генерация исключения недешевый процесс. Поэтому, если ситуация такая, что исключения ожидаются часто, то имеет смысл написать и "погромоздче".
29 мар 07, 14:09    [3956062]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуться  [new]
__vvp_
Member

Откуда: Санкт-Петербург
Сообщений: 1158
_spy_
__vvp_
А если вообще избежать EXCEPTION

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


v := null;
nrow := 0
for i in (select f
          from t
          where ...)
loop
  v := i.f;
  nrow := 1;
  EXIT;

end loop; 

if nrow = 1 then ....
else ...

Ну кода не многим больше, чем в
tru55
BEGIN
.....

  BEGIN
    SELECT INTO...
  EXCEPTION

  END;
..... 
END;


Как вариант...
29 мар 07, 14:10    [3956074]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуться  [new]
arhey
Member

Откуда: Санкт-Петербург. Россия... :)
Сообщений: 221
Elic
arhey
вот эти вот точки, вот эти вот откаты
Ты можешь цитировать тонны доки, но пока что это всё никак не связано с темой :)
Hint: попробуй найти в вопросе хоть что-нибудь, что даст тебе моральное право распинаться про Statement-Level Rollback


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

нормальное понимание процесса обработки ошибок не придет, если отмахиваться от таких вещей.

я нашел это не в вопросе, а в твоих постах. :))
29 мар 07, 14:13    [3956086]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуться  [new]
Elic
Member

Откуда:
Сообщений: 29980
tru55
Хех...
1. если выбирается только одна строка, зачем EXIT ?
STFF for...loop...exit...end loop VS select...into
tru55
2. если может выбраться несколько, а тебе нужна первая, то м.б. проще?
А это кому как удобней :)
29 мар 07, 14:15    [3956096]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуться  [new]
Elic
Member

Откуда:
Сообщений: 29980
arhey
а для ответа на твое необоснованное заявление, что транзакции и обработки исключений ни при чем.
Ты сам себе выдумал тему для базара и страстно её нагнетал.
Увы, вернуть тебя в лоно темы не удалось.
29 мар 07, 14:24    [3956127]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуться  [new]
ушастик
Guest
а если сделать

select count(что хочешь выбрать) from .. where ... into cnt;
if cnt = 0 then
...
else
...
то есть сначала смотрим есть ли эти данные - если их нету - то cnt будет равно нулю. а потом уже делаем то что нам надо
29 мар 07, 14:26    [3956153]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуться  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6913
1. можно обойтись без SELECT INTO используя курсора, не надо будет тогда ошибки обрабатывать
2. обернуть только данный блок в BEGIN... EXCEPTION и радоваться жизни
29 мар 07, 14:30    [3956171]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуться  [new]
__vvp_
Member

Откуда: Санкт-Петербург
Сообщений: 1158
Elic
tru55
Хех...
1. если выбирается только одна строка, зачем EXIT ?
STFF for...loop...exit...end loop VS select...into
tru55
2. если может выбраться несколько, а тебе нужна первая, то м.б. проще?
А это кому как удобней :)


В книге МакДональда Oracle PL/SQL для профессионалов: практические решения про for...loop...exit...end loop и select...into неплохо написано.
29 мар 07, 14:30    [3956173]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить