|
|
|
Кривой вопрос в пятницу: PL-SQL, групповые функции, статический SQL, Том Кайт
|
|||
|---|---|---|---|
|
#18+
Timm Andrew MaxПри выполнении DDL оператора (CREATE OR REPLACE) парсинг, безусловно, происходит. Но следующий пример показывает, что даже парсинг анонимного блока не вызывает ошибок, в то время как парсинг отдельного SQL-запроса приводит к ORA-00937: ... Не понимаю, в чем может быть разница при парсинге анонимного/хранимого PL-блоков? Для чего этот пример? :)Потому что в приведенном примере продемонстрирован явный парсинг ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2007, 16:20 |
|
||
|
Кривой вопрос в пятницу: PL-SQL, групповые функции, статический SQL, Том Кайт
|
|||
|---|---|---|---|
|
#18+
Timm Andrew MaxПри выполнении DDL оператора (CREATE OR REPLACE) парсинг, безусловно, происходит. Но следующий пример показывает, что даже парсинг анонимного блока не вызывает ошибок, в то время как парсинг отдельного SQL-запроса приводит к ORA-00937: ... Для чего этот пример? :) Ммм... пока думал, как ответить - за меня ответила Jannny. Спасибо. Пример - ни для чего иного, кроме как в качестве ответа на мнение, высказанное здесь: andrey_anonymous... мне представляется, что при компиляции PL/SQL кода парсинга SQL-запросов не происходит. Пример с DBMS_SQL просто показал, что парсинг происходит-таки. Еще его, разумеется, можно увидеть "явно", через V$MYSTAT: Код: 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. 39. 40. 41. 42. Но ошибки данный парсинг по каким-то причинам не вызывает. По поводу природы этих причин у меня пока гипотез нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2007, 16:32 |
|
||
|
Кривой вопрос в пятницу: PL-SQL, групповые функции, статический SQL, Том Кайт
|
|||
|---|---|---|---|
|
#18+
TimmНе понимаю, в чем может быть разница при парсинге анонимного/хранимого PL-блоков? Для чего этот пример? :)Для того, чтобы показать, что парсер чисто-SQL-я и парсер SQL-я-внутри-PL/SQL-я - это всё ещё разные движки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2007, 16:33 |
|
||
|
Кривой вопрос в пятницу: PL-SQL, групповые функции, статический SQL, Том Кайт
|
|||
|---|---|---|---|
|
#18+
Ага, понятно, спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2007, 16:46 |
|
||
|
Кривой вопрос в пятницу: PL-SQL, групповые функции, статический SQL, Том Кайт
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров Jannny TiGНу тогда вспомним такую фичу как процедуры с правами вызывающего - что реально будет вызываться станет известно только на момент выполнения.Только в данном случае это совсем ни при чем... Именно причем Увы, ни функции, ни AUTHID здесь ни при чем. В следующем примере уж точно нет ничего, что можно было бы посчитать функцией либо списать на механизм AUTHID: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Мое ИМХО: причина - в "недоделанности" парсера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2007, 16:59 |
|
||
|
Кривой вопрос в пятницу: PL-SQL, групповые функции, статический SQL, Том Кайт
|
|||
|---|---|---|---|
|
#18+
Andrew MaxУвы, ни функции, ни AUTHID здесь ни при чем. В следующем примере уж точно нет ничего, что можно было бы посчитать функцией либо списать на механизм AUTHID: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2007, 17:05 |
|
||
|
Кривой вопрос в пятницу: PL-SQL, групповые функции, статический SQL, Том Кайт
|
|||
|---|---|---|---|
|
#18+
andreymx Andrew MaxУвы, ни функции, ни AUTHID здесь ни при чем. В следующем примере уж точно нет ничего, что можно было бы посчитать функцией либо списать на механизм AUTHID: Код: plaintext Хм. Польщен. Засмущался. Спасибо, тезка. ЗЫ: Алиас "D" можно из примера выбросить, он, разумеется, ни на что не влияет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2007, 17:16 |
|
||
|
Кривой вопрос в пятницу: PL-SQL, групповые функции, статический SQL, Том Кайт
|
|||
|---|---|---|---|
|
#18+
Andrew Max.. Мое ИМХО: причина - в "недоделанности" парсера. +1 А банальная причина может быть в лени разбираться не есть ли это нечто синтаксически корректное, например, при наличии окна: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2007, 18:47 |
|
||
|
Кривой вопрос в пятницу: PL-SQL, групповые функции, статический SQL, Том Кайт
|
|||
|---|---|---|---|
|
#18+
Andrew MaxПри выполнении DDL оператора (CREATE OR REPLACE) парсинг, безусловно, происходит. Тезка, парсинг ЧЕГО? А происходит парсинг DDL-предложения "create or replace..." При этом никакого парсинга проблемного sql-предложения "select from..." НЕ ПРОИСХОДИТ, в чем можно элементарно убедиться по трассе 10046. Все, что делается - проверка синтаксиса, семантика же предожения select на этом этапе не проверяется. Ладно молодые и горячие, но Вы-то... Иеххх, куда катится мир :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2007, 01:17 |
|
||
|
Кривой вопрос в пятницу: PL-SQL, групповые функции, статический SQL, Том Кайт
|
|||
|---|---|---|---|
|
#18+
andreymx... #2765516 P.S.: В мире много сказок, в мире много сказок, грустных и смешных... ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2007, 04:12 |
|
||
|
Кривой вопрос в пятницу: PL-SQL, групповые функции, статический SQL, Том Кайт
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous... Процитирую один важный момент еще раз: andrey_anonymous... мне представляется, что при компиляции PL/SQL кода парсинга SQL-запросов не происходит. Да, признаю, я несколько поспешил с критикой, упустив из виду то, что акцент был сделан на словах "SQL-запросов". Мой пример с DBMS_SQL, демонстрирует тот факт, что даже парсинг анонимного PL/SQL-блока, содержащего некорректный статический SQL, выполняется успешно (и это, действительно, может стать источником малоприятных сюрпризов). andrey_anonymousПри этом никакого парсинга проблемного sql-предложения "select from..." НЕ ПРОИСХОДИТ, в чем можно элементарно убедиться по трассе 10046. Вот здесь, на мой взгляд, нужно определиться с терминами. Разумеется, в трассе 10046 в нашем случае не будет упоминаний об отдельных запросах в нашем PL/SQL-блоке, который подвергается парсингу. Конечно, не увидим мы никаких следов и в V$SQL, V$SQL_PLAN. Все это вполне логично и понятно: никаких SQL-курсоров на данном этапе мы не открываем и никаких планов выполнения не строим. Но можем ли мы на основании этих факторов судить о том, что "никакого парсинга проблемного sql-предложения не происходит"? Полагаю, что все-таки не можем. Да, вышеперечисленные факторы дают нам основания полагать, что в нашей ситуации запросы не парсятся SQL-машиной. Но они, разумеется, обрабатываются PL/SQL-парсером, который, в силу особенностей своей реализации, иногда вот так вот чудит. Разумеется, мы должны помнить о том, что парсинг - это не только построение планов. Строго говоря, планами вообще занимается не парсер, а query optimizer. А парсинг - это прежде всего синтаксическая и семантическая проверки , без которых статический SQL в PL/SQL - просто немыслим. andrey_anonymousВсе, что делается - проверка синтаксиса, семантика же предложения select на этом этапе не проверяется. Здесь категорически не согласен. Проверка семантики обязана выполняться ( и выполняется ). К примеру, следующий запрос корректен синтаксически, но неверен семантически: Код: plaintext Семантические проверки - это проверки того, что указанные в запросе объекты существуют и пользователь имеет все необходимые привилегии. Столбец "BLABLABLA" отсутствует в таблице SYS.DUAL, поэтому семантическая проверка окончится неуспешно, хотя с синтаксической точки зрения звпрос корректен. Разумеется, PL/SQL такой семантически некорректный запрос не пропустит: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. А вот такой звпрос будет некорректным даже синтаксически: Код: plaintext Например, вот здесь , в начале статьи все это обстоятельно описывается. Так что - нет, пока что Вы не убедили меня в том, что при парсинге PL/SQL-блоков "никакого парсинга проблемных sql-предложений" не происходит. Происходит . Просто выполняется он, по-видимому, PL/SQL-парсером, что иногда приводит к таким вот казусам. andrey_anonymousЛадно молодые и горячие, но Вы-то... Я заинтригован. Вы разве обладаете информацией относительно моего возраста? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2007, 04:30 |
|
||
|
Кривой вопрос в пятницу: PL-SQL, групповые функции, статический SQL, Том Кайт
|
|||
|---|---|---|---|
|
#18+
Andrew MaxНо можем ли мы на основании этих факторов судить о том, что "никакого парсинга проблемного sql-предложения не происходит"? Пришла моя очередь уточнить что конкретно я имел ввиду :) А имел я ввиду тот факт, что в обсуждаемом случае парсинг не производится SQL-машиной, потому и ссылался на 10046. Да, безусловно, парсинг - составная часть процесса компиляции PL/SQL кода. Но парсер PL/SQL машины - это совсем другой парсер, он разбирает PL/SQL. Да, семантическая проверка - часть парсинга. Но семантика PL/SQL и семантика SQL - все-таки заметно отличаются. PL/SQL - императивен, SQL - декларативный язык. Поэтому парсер PL/SQL, несмотря на ряд выполняемых проверок, не может заменить собой парсер SQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2007, 12:29 |
|
||
|
Кривой вопрос в пятницу: PL-SQL, групповые функции, статический SQL, Том Кайт
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous Да, безусловно, парсинг - составная часть процесса компиляции PL/SQL кода. Но парсер PL/SQL машины - это совсем другой парсер, он разбирает PL/SQL. Да, семантическая проверка - часть парсинга. Но семантика PL/SQL и семантика SQL - все-таки заметно отличаются. PL/SQL - императивен, SQL - декларативный язык. Поэтому парсер PL/SQL, несмотря на ряд выполняемых проверок, не может заменить собой парсер SQL. Отработка dbms_output в процедуре перед вызовом ошибки говорит, видимо, в пользу этих слов... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2007, 13:01 |
|
||
|
Кривой вопрос в пятницу: PL-SQL, групповые функции, статический SQL, Том Кайт
|
|||
|---|---|---|---|
|
#18+
РикоОтработка dbms_output в процедуре перед вызовом ошибки говорит, видимо, в пользу этих слов... Не поясните свою мысль? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2007, 13:50 |
|
||
|
Кривой вопрос в пятницу: PL-SQL, групповые функции, статический SQL, Том Кайт
|
|||
|---|---|---|---|
|
#18+
С этим оператором что-то вообще не все понятно Например, он не попадает в трассу -- ни разбор, ни ошибка. Возможно, надо выполнять трассировку с другим уровнем, но все равно это как-то аномально. Еще мне интересно, почему в трассе нет ошибок выполнения? Код: 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. 39. 40. 41. Код: 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. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2007, 04:09 |
|
||
|
Кривой вопрос в пятницу: PL-SQL, групповые функции, статический SQL, Том Кайт
|
|||
|---|---|---|---|
|
#18+
Владимир Бегун#2765516 Код: plaintext 1. 2. 3. 4. 5. 6. За 4 года некому было пофиксить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2007, 09:32 |
|
||
|
Кривой вопрос в пятницу: PL-SQL, групповые функции, статический SQL, Том Кайт
|
|||
|---|---|---|---|
|
#18+
andreymxЗа 4 года некому было пофиксить:-) Приоритет низкий, есть workaround... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2007, 09:38 |
|
||
|
Кривой вопрос в пятницу: PL-SQL, групповые функции, статический SQL, Том Кайт
|
|||
|---|---|---|---|
|
#18+
andreymxЗа 4 года некому было пофикситьЭто древняя "фича" :) Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2007, 09:47 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=34444127&tid=1886011]: |
0ms |
get settings: |
7ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
177ms |
get topic data: |
13ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 486ms |

| 0 / 0 |
