|
|
|
Почему статанализатор PLSQL не отлавливает ORA-00979 not a group by expression
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Я - быдлокодер, пешу код под Oracle. Пусть T - таблица со столбцами A,B,C. Как-то я написал процедуру вида Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. скомпилил - и процедура скомпилилась! Хотя совершенно очевидно, что работать она никогда не будет и выдаст ORA-00979 not a group by expression. Аналогично компилируется любой сложный запрос, в котором список не группируемых полей не совпадает с их списком в клаузе group by. Вопрос в том, почему статический анализатор PLSQL не отлавливает ORA-00979 not a group by expression при компиляции? Неужели есть какой-то хитрый вариант запроса с group by и неверным списком полей. Или это баг Oracle? В последнее верится с трудом, ибо это какой-то совсем тупой баг. Или я чего-то еще не понимаю? Вопрос этот для меня как для быдлокодера имеет значение, поскольку при использовании методологии разработки "херак-херак и в продакшн" простейшая потеря поля приводит к тому, что поставленный клиенту функционал тупо не работает. Я честно погуглил (правда, только в русскоязычном сегменте) и поискал на форуме по словам group by, нашел 5 страниц тем, но не увидел аналогичной темы, потому создал свою и надеюсь на Ваш ответ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2017, 21:20 |
|
||
|
Почему статанализатор PLSQL не отлавливает ORA-00979 not a group by expression
|
|||
|---|---|---|---|
|
#18+
Покажите листинг SQL*Plus, где вы создали таблицу, выполнили успешную компиляцию процедуры и получили ошибку выполнения. Без этого все ваши слова - это пустой паровой зеленый свисток. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2017, 00:20 |
|
||
|
Почему статанализатор PLSQL не отлавливает ORA-00979 not a group by expression
|
|||
|---|---|---|---|
|
#18+
Скорее всего из серии "обзову я PL/SQL переменную или параметр так-же как и имя поля таблицы": Код: 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. 25. 26. 27. 28. 29. 30. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2017, 00:59 |
|
||
|
Почему статанализатор PLSQL не отлавливает ORA-00979 not a group by expression
|
|||
|---|---|---|---|
|
#18+
Хотя, таки-да, компилируется, но ошибка отложена до выполнeния: Код: 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. 25. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2017, 01:08 |
|
||
|
Почему статанализатор PLSQL не отлавливает ORA-00979 not a group by expression
|
|||
|---|---|---|---|
|
#18+
Sonic86статический анализатор PLSQL не отлавливает ORA-00979 not a group by expression при компиляции вкратце и очень грубо говоря, потому что во время компиляции PL/SQL объектов для таких запросов выполняются только синтаксический и семантический анализ, а этот тип ошибок не проверяется ни на синтаксическом, ни на семантическом анализе, а только на этапе оптимизации. 1. синтаксический анализ - это анализ конструкций языка (например, "select * form dual" прервется с ошибкой на этом этапе) 2. семантический анализ - это проверка типов объектов, столбцов таблиц и вьюх, грантов на них, и тд., т.е. тут с ошибкой прервутся уже селекты по несуществующим или не грантованным таблицам и тд 3. оптимизация - грубо говоря, трансформации запроса и построение плана. Вот тут-то как раз прервется по этой ORA-00979. Если в деталях, то читай у Льюиса "Oracle core" раздел 7 "Parsing and optimizing". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2017, 03:55 |
|
||
|
Почему статанализатор PLSQL не отлавливает ORA-00979 not a group by expression
|
|||
|---|---|---|---|
|
#18+
Sonic86, в явном виде ответа на твой вопрос в доках не видел. Но есть намёк почему: http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/cursor_for_loop_statement.htm#CJAIGGIA For select_statement, PL/SQL declares, opens, fetches from, and closes an implicit cursor. Т.е. до выполнения select не задекларирован ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2017, 04:34 |
|
||
|
Почему статанализатор PLSQL не отлавливает ORA-00979 not a group by expression
|
|||
|---|---|---|---|
|
#18+
о.О как изVladimir FilinFor select_statement, PL/SQL declares, opens, fetches from, and closes an implicit cursor.получилось это Vladimir FilinТ.е. до выполнения select не задекларирован? для лучшего понимания: Код: 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. 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. 50. 51. 52. 53. 54. 55. подсказка Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2017, 05:16 |
|
||
|
Почему статанализатор PLSQL не отлавливает ORA-00979 not a group by expression
|
|||
|---|---|---|---|
|
#18+
xtender, ОК, после праздников посмотрю. Интересно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2017, 16:42 |
|
||
|
Почему статанализатор PLSQL не отлавливает ORA-00979 not a group by expression
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2017, 08:43 |
|
||
|
Почему статанализатор PLSQL не отлавливает ORA-00979 not a group by expression
|
|||
|---|---|---|---|
|
#18+
andreymx, надо было и ссылку сюда указать, т.к. там-то ответа так и нет. А на самом деле там еще и запутались... Грубо говоря, есть 4 вида ошибок: Синтаксические ошибки, например: ORA-00923: FROM keyword not found where expected ORA-00924: missing BY keyword и тд Семантические ошибки, например: ORA-00913: Too many values ORA-00960 ambiguous column naming in select list ... Ошибки выявляемые при оптимизации, т.е. ошибки которые оракл выявляет при анализе трансформаций, типа ошибки из топика (ORA-00979, ORA-00937,...) Рантайм-ошибки, т.е. фазы execution. (ORA-01722, ORA-01427,...) При ошибках семантического и синтаксического анализа, оракл прерывает с ошибкой до этапа оптимизации, т.е. трассы 10053 для них не будет. При рантайм ошибках план уже будет, т.е. трасса 10053 сформируется без ошибок. При PL/SQL компиляции оракл выполняет только синтаксический и семантический анализ, поэтому ошибок последних двух типов он не обнаруживает. 1. Из документации: Syntactic and Semantic Checking syntactic checking verifies that keywords, object names, operators, delimiters, and so on are placed correctly in your SQL statement.... semantic checking verifies that references to database objects and host variables are valid and that host-variable datatypes are correct. 2. Если нет книги Oracle Core, то гляньте этот кусок тут : ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2017, 11:11 |
|
||
|
Почему статанализатор PLSQL не отлавливает ORA-00979 not a group by expression
|
|||
|---|---|---|---|
|
#18+
На самом деле некритично, но бывает обидно - скомпилировалось, но не работает :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2017, 18:37 |
|
||
|
Почему статанализатор PLSQL не отлавливает ORA-00979 not a group by expression
|
|||
|---|---|---|---|
|
#18+
andreymx, обидно бывает только если ты этот запрос отдельно не выполнял, а писал в слепую на скорую руку быстрее быстрее лишь бы отвязались))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2017, 10:20 |
|
||
|
Почему статанализатор PLSQL не отлавливает ORA-00979 not a group by expression
|
|||
|---|---|---|---|
|
#18+
Vintandreymx, обидно бывает только если ты этот запрос отдельно не выполнял, а писал в слепую на скорую руку быстрее быстрее лишь бы отвязались)))было такое, было когда расчет, и прибегают - добавь пару полей, срочно и добавляешь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2017, 11:47 |
|
||
|
Почему статанализатор PLSQL не отлавливает ORA-00979 not a group by expression
|
|||
|---|---|---|---|
|
#18+
andreymx, Так почему обидно-то? Все равно ведь очевидно, что без внимательной проверки/тестирования не обнаружить как минимум рантайм ошибки... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2017, 11:58 |
|
||
|
Почему статанализатор PLSQL не отлавливает ORA-00979 not a group by expression
|
|||
|---|---|---|---|
|
#18+
xtenderТак почему обидно-то? Все равно ведь очевидно, что без внимательной проверки/тестирования не обнаружить как минимум рантайм ошибки...рантайм ошибки провоцируются характерными данными. Несгруппированность выражения никакими данными не исправится - незачем оттягивать ошибку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2017, 12:20 |
|
||
|
Почему статанализатор PLSQL не отлавливает ORA-00979 not a group by expression
|
|||
|---|---|---|---|
|
#18+
andreymx, то есть, кроме того, что написал не глядя еще и ни разу не запустил для тестирования?) ну и кто после этого злобный буратино?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2017, 12:20 |
|
||
|
Почему статанализатор PLSQL не отлавливает ORA-00979 not a group by expression
|
|||
|---|---|---|---|
|
#18+
Vintandreymx, то есть, кроме того, что написал не глядя еще и ни разу не запустил для тестирования?) ну и кто после этого злобный буратино?)конечно, ты прав но иногда для какой-то процедуры расчета не имеет смысла проводить отдельное тестирование, ибо сама по себе она ничего не показывает при этом сам полный расчет занимает час-два, а их-то и нету вот и приходится совмещать тестирование и продакшн ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2017, 12:34 |
|
||
|
Почему статанализатор PLSQL не отлавливает ORA-00979 not a group by expression
|
|||
|---|---|---|---|
|
#18+
Elicрантайм ошибки провоцируются характерными данными.ну не только же... как минимум, есть еще ошибки/опечатки, приводящие ко всяким устойчивым ошибкам независимо от данных ElicНесгруппированность выражения никакими данными не исправится - незачем оттягивать ошибку.:) кстати, касательно ошибки из топика: я где-то уже видел, когда в запросе поле таблицы именовалось так же как и функция, ну и редко-редко получали плавающие ошибки - не те данные получали ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2017, 12:40 |
|
||
|
Почему статанализатор PLSQL не отлавливает ORA-00979 not a group by expression
|
|||
|---|---|---|---|
|
#18+
Товарищи, спасибо большое за ответы! Тему ту я не нашел, к сожалению, сразу. Из текстов обеих тем ответ мне стал понятен. Жаль, сейчас книжку Льюиса на русском негде скачать. (Интересно, считается ли это багом, или Oracle вообще это обрабатывать не собираются? Ну хотя бы warning какой-нибудь выдать. Хотя конечно кто их знает.) Ошибки выявляемые при оптимизации, т.е. ошибки которые оракл выявляет при анализе трансформаций, типа ошибки из топика (ORA-00979, ORA-00937,...)А какие еще ошибки такого рода есть? Это тоже в 7-й главе Льюиса смотреть? Или это только в хардкорной документации есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2017, 22:37 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39446669&tid=1885989]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
173ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
67ms |
get tp. blocked users: |
2ms |
| others: | 208ms |
| total: | 487ms |

| 0 / 0 |
