|
Оператор WHEN
|
|||
---|---|---|---|
#18+
Чтобы не замусоривать тему документации, начну новую. Оператор WHEN … DO вызывается только в том случае, если произошло одно из указанных в его условии событий. В случае выполнения оператора (даже если в нем фактически не было выполнено никаких действий) ошибка или пользовательское исключение не прерывает и не отменяет действий триггера или хранимой процедуры, где был выдан этот оператор , работа продолжается, как если бы никаких исключительных ситуаций не было. Да щаззз же. Весь блок BEGIN-END в котором стоит WHEN - откатывается. Что особенно прикольно, после его выполнения откатывается и то, что им (блоком WHEN) сделано. Дока молчит по поводу "в каком состоянии операторы блока WHEN должны видеть БД?" В примерах в блоке исключительно один оператор, но что если их там несколько и исключение возникло только в последнем? Должен блок WHEN видеть изменения, сделанные успешно завершенными операторами до того как они будут отменены?. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2014, 19:57 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovДа щаззз же. Весь блок BEGIN-END в котором стоит WHEN - откатывается. да щаззз. Весь откатывается только если ошибка была не в DML, иначе откатывается только сбойный стейтмент. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2014, 20:41 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
dimitrВесь откатывается только если ошибка была не в DML, иначе откатывается только сбойный стейтмент. Ага, щаззз. Сбойный стейтмент откатывается до выполнения блоков WHEN. Остальное откатывается сразу после них. И таки да, любой из двух ныне имеющихся в тройке багов может откатить по сейфпоинту сверху. А если объединятся и сильно постараются, то, возможно, смогут сожрать и транзакционный. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2014, 20:47 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovАга, щаззз. Сбойный стейтмент откатывается до выполнения блоков WHEN. Остальное откатывается сразу после них. откатывается, если WHEN не выбрасывает исключения? Dimitry SibiryakovИ таки да, любой из двух ныне имеющихся в тройке багов может откатить по сейфпоинту сверху. этому баяну лет 10 уже, наверное. И не в тройке, а во всех версиях ФБ. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2014, 20:59 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
dimitrоткатывается, если WHEN не выбрасывает исключения? Разумеется. Атомарность блока BEGIN-END нарушать нехорошо. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2014, 21:36 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Оператор WHEN … DO вызывается только в том случае, если произошло одно из указанных в его условии событий. В случае выполнения оператора (даже если в нем фактически не было выполнено никаких действий) ошибка или пользовательское исключение не прерывает и не отменяет действий триггера или хранимой процедуры, где был выдан этот оператор , работа продолжается, как если бы никаких исключительных ситуаций не было. Да щаззз же. Весь блок BEGIN-END в котором стоит WHEN - откатывается. Что особенно прикольно, после его выполнения откатывается и то, что им (блоком WHEN) сделано. В целом предложение верное. Действие процедуры или триггера целиком действительно не отменяется. А вот про BEGIN...END и действия в WHEN действительно не описано. Dimitry SibiryakovДока молчит по поводу "в каком состоянии операторы блока WHEN должны видеть БД?" В примерах в блоке исключительно один оператор, но что если их там несколько и исключение возникло только в последнем? Должен блок WHEN видеть изменения, сделанные успешно завершенными операторами до того как они будут отменены?. Не знаю. По идее WHEN должен видеть всё что произошло до сбойного оператора. Надо будет провести эксперимент. Если ты знаешь то скажи как обстоят дела. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2014, 09:42 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
Симонов Денис, так оно и есть Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2014, 10:08 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, и таки я не увидел что весь блок BEGIN...END откатывается. Откатилось только начиная со сбойного оператора. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2014, 10:10 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
Симонов Дениси таки я не увидел что весь блок BEGIN...END откатывается. Откатилось только начиная со сбойного оператора. Хммм... Ага, я понял что я делал неправильно. Я помещал WHEN после END. И кроме того, использовал деление на ноль как генератор ошибки. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2014, 12:08 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakovя понял что я делал неправильно. И в том, что результат работы самого блока WHEN откатывается я тоже неправ. Где тут смайлик, бьющийся об стену?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2014, 14:00 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
Симонов Денися не увидел что весь блок BEGIN...END откатывается. Откатилось только начиная со сбойного оператора .Это если сей "сбойный оператор" не является вызовом ХП. Иначе всё наоборот. DDL: Код: plaintext 1. 2. 3. 4. 5. 6.
Test: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38.
Result: Код: plaintext 1.
PS. CORE-4483 : "Changed data not visible in WHEN-section if exception occured inside SP that has been called from this code" PPS. Денис, а я вроде бы тебе говорил про эту "мегафичу" в личке, когда .doc отсылал ? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2014, 14:11 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
Таблоид, посмотрел. Там такой же эффект даёт 0/0. Пожалуй это стоит вписать как примечание. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2014, 14:28 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
Симонов ДенисПожалуй это стоит вписать как примечание. Разве что как ссылку на бага. Но тогда туда же придётся запихать и CORE-4424 . Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2014, 14:44 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
Симонов Денис, Умеете ж Вы радовать. Пошёл код перепроверять. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2014, 19:24 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
Евгений БолтикСимонов Денис, Умеете ж Вы радовать. Пошёл код перепроверять. Мнда слов нет. Теперь понятно почему иногда были не понятки. Благо это место пока мало используется. Уже не раз пытался через логи найти. Блин неужели никому из вас не надо было текст сообщения ошибки в блоке WHEN ANY DO begin в DELPHI уже давно с помощью try и лога сообщений ловлю самые замысловатые ошибки, но SQL кроме танца с бубном перед WHEN ANY DO begin и в блоке WHEN ANY DO begin ничего не сделаешь, если все запросы виртуальные. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2014, 20:02 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Симонов Денис, Добрый день. Только вчера столкнулся с этой багой (фитчей?): Оставил вопрос на тостере , но там народ видимо немного другой тематики - просмотров много, а ответов нет. Либо я криворукий, либо действительно Код: plsql 1. 2. 3. 4. 5.
откатывает только ошибочную команду и последующие. Все что до ошибки - прекрасно комитится. Отката всего блока begin/end не происходит. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2017, 19:48 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
sezavasasilov> Все что до ошибки - прекрасно комитится. sezavasasilov> Отката всего блока begin/end не происходит. Так ты полный пример приведи. Что там до ошибки, suspend-ы поди ? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2017, 19:55 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
sezavasasilovОтката всего блока begin/end не происходит.Никто этого и не обещал. RTFM: Scope of a WHEN ... DO Statement ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2017, 20:31 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
Гаджимурадов РустамЧто там до ошибки, suspend-ы поди ? а вот и нет. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
for select в данном случае возвращает код DDL операторов: Код: plsql 1. 2. 3. 4.
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Первый выполняется без ошибок, во втором намеренно допущена ошибка в названии таблицы, чтобы вызвать исключение. Из доки строки (стр. 495): авторВнутренне автоматические точки сохранения используется для: • отмены всех действий внутри блока BEGIN ... END, где происходит исключение; авторСами по себе блок BEGIN..END не создаёт автоматическую точку сохранения. Она создаётся только в блоках, которых присутствует блок WHEN для обработки исключений или ошибок. Вот я и ожидал такого поведения, что если произойдет ошибка, то должен сработать откат всего блока, включая и команды, выполненных без ошибок. Однако после комита, таблица test_table1 все-таки создается. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2017, 20:47 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
sezavasasilov, там кучу примечаний написано, прочитай их ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2017, 21:19 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
Любители "стрелять себе в ногу" созданием на лету таблиц - должны страдать, что собственно мы и видим. исполни скрипт в isql, закоммить изменение метаданных, потом следующим коннектом уже заливай данные. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2017, 21:25 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
Ivan_Pisarevsky, это слишком просто А мы не ищем легких путей) Задача стоит именно такая - накатить скрипт из процедуры ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2017, 22:13 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
sezavasasilovоткатывает только ошибочную команду и последующие. Все что до ошибки - прекрасно комитится. Отката всего блока begin/end не происходит. немедленно читать http://www.ibase.ru/savepoints/ ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2017, 01:19 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
sezavasasilovЗадача стоит именно такая - накатить скрипт из процедуры если скрипт содержит ddl, то задача вполне себе идиотская. Еще более идиотским является выполнение команд ddl из execute statement. Таким образом, уровень идиотизма постановщика задачи зашкалил. p.s. я не шучу и никого не оскорбляю. Просто констатирую, как специалист по работе с ИБ-ФБ с 23-летним стажем. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2017, 01:22 |
|
|
start [/forum/topic.php?fid=40&msg=38801626&tid=1561636]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
37ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 18ms |
total: | 145ms |
0 / 0 |