|
Обработка ошибки syntax_error
|
|||
---|---|---|---|
#18+
Возможно ли добиться правильной обработки ошибки syntax_error, так, чтобы в контексте ошибки указывалась, непосредственно, ошибочная инструкция (в данном примере arr_test = (select id, val1 from aaa)). Все попытки (в т.ч. явное указание when syntax_error then) не приводят к желаемому результату. Контекст, просто, не содержит инструкции-виновницы и начинается уровнем выше. В данном случае это блок do "PL/pgSQL function inline_code_block line 9 at assignment" В документации указаны только две ошибки, при обработке которых есть тонкости (query_canceled и assert_failure). Про syntax_error ничего не нашёл. Использую PostgresPRO: PostgreSQL 9.6.5, compiled by Visual C++ build 1800, 64-bit Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2017, 18:07 |
|
Обработка ошибки syntax_error
|
|||
---|---|---|---|
#18+
ДонАтелло, `GET STACKED DIAGNOSTICS` надо один раз вызывать, передавая набор переменных через запятую, как в доке: https://www.postgresql.org/docs/current/static/plpgsql-control-structures.html#PLPGSQL-EXCEPTION-DIAGNOSTICS Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2017, 20:23 |
|
Обработка ошибки syntax_error
|
|||
---|---|---|---|
#18+
vyegorov, Да, спасибо, это в суматохе. Но сути проблемы это не меняет. С единственным вызовом то же самое. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2017, 20:27 |
|
Обработка ошибки syntax_error
|
|||
---|---|---|---|
#18+
ДонАтелло, Ошибка возникает при синтаксическом анализе анонимного блока (DO) перед его выполнением. Соответственно поймать эту ошибку в коде блока в принципе невозможно. Блок выполняться даже не начинает, какой exception. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2017, 21:27 |
|
Обработка ошибки syntax_error
|
|||
---|---|---|---|
#18+
Павел Лузанов, Ну ответ принимается. Разумно. Но есть одна нестыковка! Если эта ошибка происходит на этапе парсинга, т.е. до выполнения, куда же она девается? В блок выполнения явно входит. И даже в блок exception попадает (мы видим отработавшие notice). Если закомментировать блок обработки ошибок, получаем законное: ERROR: subquery must return only one column LINE 1: SELECT (select id, val1 from aaa) Т.е. видим проблемный запрос и знаем куда бежать исправлять. А с обработчиком ошибок мы эту возможность теряем. Несправедливо же? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2017, 12:17 |
|
Обработка ошибки syntax_error
|
|||
---|---|---|---|
#18+
ДонАтелло, Точно, именно эту ошибку синтаксиса, plpgsql парсер не понимает и она перехватывается только в момент выполнения. Поэтому возвращаемся к исходному вопросу. Текст текущего анонимного блока можно взять из pg_stat_activity.query. Что-то типа: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Ну и вырезать нужную строку из запроса. А можно и визуально посчитать. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2017, 13:01 |
|
|
start [/forum/topic.php?fid=53&fpage=65&tid=1996190]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
94ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
2ms |
others: | 16ms |
total: | 208ms |
0 / 0 |