|
Отвалидировать запросы
|
|||
---|---|---|---|
#18+
Хочу поднять старую тему . Вкратце: в базе лежат SQL DML запросы. Периодически структура базы меняется и запросы перестают выполняться. Мне нужно в определенный момент проверить валидны ли запросы или нет. Сейчас это делается вызовом UDF, которая делает этим запросам Prepare и возвращает OK или текст ошибки. Хотелось бы иметь функцию ibec_Prepare(), которая бы взяла этот функционал на себя. С уважением, Vasilisk ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2020, 19:56 |
|
Отвалидировать запросы
|
|||
---|---|---|---|
#18+
ibec_GetStatementPlan есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2020, 04:11 |
|
Отвалидировать запросы
|
|||
---|---|---|---|
#18+
IBExpert ibec_GetStatementPlan есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2020, 17:29 |
|
Отвалидировать запросы
|
|||
---|---|---|---|
#18+
IBExpert ibec_GetStatementPlan Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Код: sql 1. 2. 3. 4. 5. 6.
Unknown error. Как бы наверное правильно, какой план от процедуры? Но изначально то хотелось функцию валидации запроса. Т.е. некий ibec_Prepare() ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 13:10 |
|
Отвалидировать запросы
|
|||
---|---|---|---|
#18+
_Vasilisk_ какой план от процедуры? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 13:36 |
|
Отвалидировать запросы
|
|||
---|---|---|---|
#18+
_Vasilisk_ Он не работает для процедур И не должен. А что ты хочешь "отвалидировать" в CREATE PROCEDURE и зачем?? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 13:38 |
|
Отвалидировать запросы
|
|||
---|---|---|---|
#18+
IBExpert А что ты хочешь "отвалидировать" в CREATE PROCEDURE _Vasilisk_ Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 14:06 |
|
Отвалидировать запросы
|
|||
---|---|---|---|
#18+
А, понятно. Ну, можно на "Unknown error" и проверять. Эта ошибка означает, что собственно prepare прошел успешно, а облом случился на запросе плана. Пока других вариантов в эксперте нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 14:31 |
|
Отвалидировать запросы
|
|||
---|---|---|---|
#18+
IBExpert Ну, можно на "Unknown error" и проверять И кстати, при таком коде Код: sql 1. 2.
я получаю пять Unknown error. Почему скрипт не прерывается на первой? Опция Abort on error установлена IBExpert prepare прошел успешно, а облом случился на запросе плана. IBExpert Пока других вариантов в эксперте нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 14:47 |
|
Отвалидировать запросы
|
|||
---|---|---|---|
#18+
_Vasilisk_ Этот Unknown error сыпется только при Raised = true. Т.е. нужно ловить исключение и дергать ibec_err_Message()? Если Raised = false возвращается пустая строка Дергать ibec_err_Message не нужно, потому что сообщение ошибки в случае RaiseError = true возвращается как результат. По идее, нужно просто проверить результат на пустую строку или эту самую unknown error в нем - _Vasilisk_ я получаю пять Unknown error. Почему скрипт не прерывается на первой? Баг, очевидно. Завтра проверю. _Vasilisk_ А планируется? Смотря что нужно. Если просто ошибку препарирования вернуть, если таковая случилась, то это на пять минут работы. Но это как-то слишком примитивно: prepare больше информации возвращает. Если уж делать, то возвращать, например, JSON с полным описанием результатов prepare. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 16:12 |
|
Отвалидировать запросы
|
|||
---|---|---|---|
#18+
В общем, я пока сделал заготовку ibec_PrepareStatement. Она пока ничего не возвращает, только поднимает исключение. Для твоих целей этого вроде достаточно. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 16:54 |
|
Отвалидировать запросы
|
|||
---|---|---|---|
#18+
IBExpert Смотря что нужно. Если просто ошибку препарирования вернуть, если таковая случилась, то это на пять минут работы. IBExpert Баг, очевидно выполняем один раз, RaiseError = true Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Получаю 1. Result: 1: Unknown error 2. Script executed with error 3. В панели сообщений Unknown error. выполняем три раза, RaiseError = true Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Получаю 1. IBEBlock MessageResult: 1: Unknown error. 2: Cannot perform operation -- DB is not open. 3: Cannot perform operation -- DB is not open. 2. Script executed with error 3. В панели сообщенийUnknown error. Cannot perform operation -- DB is not open. Cannot perform operation -- DB is not open. выполняем три раза, RaiseError = false Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Получаю 1. IBEBlock MessageResult: 1:. 2: 3:2. Script executed successfully 3. В панели сообщений ничего ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 17:09 |
|
Отвалидировать запросы
|
|||
---|---|---|---|
#18+
_Vasilisk_ Там какой-то сюрреализм В свежей версии проверяй. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 17:29 |
|
Отвалидировать запросы
|
|||
---|---|---|---|
#18+
_Vasilisk_ выполняем три раза, RaiseError = false ... Получаю 1. IBEBlock MessageResult: 1:. 2: 3: 3. В панели сообщений ничего А тут что не так? Все правильно: план пустой, исключение не поднимается. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 17:32 |
|
Отвалидировать запросы
|
|||
---|---|---|---|
#18+
IBExpert А тут что не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 17:58 |
|
Отвалидировать запросы
|
|||
---|---|---|---|
#18+
_Vasilisk_ То, что пустая строка при Raised = false возвращается и при ошибке prepare Так и задумано. Плана же нет. A RaiseError = FALSE означает, что ошибки тебе не интересны. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 18:04 |
|
Отвалидировать запросы
|
|||
---|---|---|---|
#18+
IBExpert В свежей версии проверяй. Теперь исходный вопрос IBExpert Дергать ibec_err_Message не нужно, потому что сообщение ошибки в случае RaiseError = true возвращается как результат. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2020, 13:13 |
|
Отвалидировать запросы
|
|||
---|---|---|---|
#18+
IBExpert В общем, я пока сделал заготовку ibec_PrepareStatement. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2020, 13:30 |
|
Отвалидировать запросы
|
|||
---|---|---|---|
#18+
_Vasilisk_ При RaiseError = true я получаю исключение (что правильно), соответственно ни о каком возвращаемом результате говорить нельзя. И все-таки нужно вызвать ibec_err_Message чтобы убедиться, что у меня не Unknown error. Или я где-то не прав? А, кстати, да. Что-то я затупил. Конечно, если исключение возникло, то присваивание не выполнится. И да, тогда надо ibec_err_Message дергать: https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1324374&msg=22120021 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2020, 13:36 |
|
|
start [/forum/topic.php?fid=42&msg=39950448&tid=1598651]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
160ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 274ms |
0 / 0 |