|
Оператор 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 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
Из доки строки (стр. 495):Из доки строки (стр. 495): кстати. у меня по ссылке выдается "Вы пытаетесь перейти по ссылке, которая устарела или ведёт на сайт, угрожающий безопасности компьютера." на официальную ссылку http://www.ibase.ru/files/firebird/langref25rus/index.html или http://www.ibase.ru/files/firebird/Firebird_2_5_Language_Reference_RUS.pdf никакой ругани нет. Вопрос - куда вела ваша ссылка? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2017, 01:26 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
sezavasasilov, я добавлю, что разный DDL создается в разные моменты времени. Часть при выдаче DDL, часть по COMMIT. Например, операции с индексами - всегда по COMMIT. Операции с таблицами - часть по DDL, часть по COMMIT. Известна проблема alter table ... add column update ... в одной транзакции (как и через execute statement). Потому что при добавлении столбца увеличивается счетчик версий метаданных, по commit новые форматы видны только новым транзакциям, и т.д. Грубо говоря, без commit после ddl тут делать нечего. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2017, 01:29 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
kdvкуда вела ваша ссылка? это наверно я прям с поиска яндекса скопировал. ссылка ведет сюда https://www.firebirdsql.org/file/documentation/reference_manuals/firebird_3_0_language_reference_rus.pdf kdvуровень идиотизма постановщика задачи зашкалил. читал предостережение по поводу execute statement, что штука нестабильная и вообще лучше ее избегать, так что даже спорить не буду) Эх, надо было писать в тему Конкурс идей про Firebird , там как раз призывали отказаться от ограничений и моральных норм) Идея была сделать менеджер пакетов для базы средствами самой базы, с отслеживанием зависимостей, версий и их автоматической установкой при необходимости. В общем, штука по-прежнему реализуема, только при условии, что скрипты не будут содержать ошибок, т.к. показала практика - их нормально обработать не получается ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2017, 17:59 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
Hello, Sezavasasilov! You wrote on 12 апреля 2017 г. 18:10:46: Sezavasasilov> В общем, штука по-прежнему реализуема, только при условии, что скрипты не будут содержать ошибок, т.к. показала практика - их нормально обработать не получается Если взрослого мыша Взять и бережно держа, Напихать в него иголок Вы получите ежа. Если этого ежа, Нос заткнув, чтоб не дышал, Где поглубже, бросить в речку Вы получите ерша. Если этого ерша, Головой в тисках зажав, Посильней тянуть за хвост Вы получите ужа. Если этого ужа, приготовив два ножа... ... Впрочем, он наверно сдохнет, Но идея хороша! (С) Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2017, 18:11 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
Особливо на ляпасинах! (с) Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2017, 18:13 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
sezavasasilovчитал предостережение по поводу execute statement, что штука нестабильнаяЧушь sezavasasilovи вообще лучше ее избегатьСовершенно не связано со "стабильностью" sezavasasilovВ общем, штука по-прежнему реализуема, только при условии, что скрипты не будут содержать ошибок, т.к. показала практика - их нормально обработать не получаетсяОчередная чушь ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2017, 18:14 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
hvladsezavasasilovчитал предостережение по поводу execute statement, что штука нестабильнаяЧушь sezavasasilovи вообще лучше ее избегатьСовершенно не связано со "стабильностью" sezavasasilovВ общем, штука по-прежнему реализуема, только при условии, что скрипты не будут содержать ошибок, т.к. показала практика - их нормально обработать не получаетсяОчередная чушь Действительно чушь) Вынес обработку ошибки в вышестоящую процедуру и все прекрасно стало ловиться и откатываться - шах и мат, аметисты! Но если серьезно, всем спасибо за советы, особенно kvd за ссылку на статью про точки сохранения - очень помогло. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2017, 19:03 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
sezavasasilovчитал предостережение по поводу execute statement, что штука нестабильная и вообще лучше ее избегать что??? предостережение это скорее по поводу "не всякому прохожему в руки дают стеклянный член" ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2017, 19:06 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
kdv"не всякому прохожему в руки дают стеклянный член"А раньше канделябром махал... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2017, 19:12 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
kdvчто??? предостережение это скорее по поводу "не всякому прохожему в руки дают стеклянный член" Может быть *смотрю в книгу - вижу фигу* ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2017, 19:21 |
|
Оператор WHEN
|
|||
---|---|---|---|
#18+
kdv> что??? предостережение это скорее по поводу Обычно всегда называли это "обезьяне гранату". Да, иногда некоторые обижались на "обезьяну". P.S. Ну ладно, стеклянный. Но почему член? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2017, 20:19 |
|
|
start [/forum/topic.php?all=1&fid=40&tid=1561636]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
55ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
72ms |
get tp. blocked users: |
1ms |
others: | 11ms |
total: | 182ms |
0 / 0 |