|
Common Procedure Expressions
|
|||
---|---|---|---|
#18+
EXECUTE STATEMENT (:varchar_variable) - сколько раз препарируется? При каждом исполнении или только при первом ? Что-то мне захотелось Common Procedure Expressions :-) Или Generic SQL Programming :-) Или u name it Простой пример: есть несколько древовидных справочников. Типа "лист ссылается на свою ветку-владельца" через FK->PK. Унаследованных. То есть столбцы называются как хотят. Хотя бы типы, кажется, везде integer. Но в идеале от них бы отвязаться бы тоже... Хочется делать join'ы других таблиц с несколькими выбираемыми пользователем "подкустами" справочников Можно выбирать ID через With Recursive но это как-то не очень красиво. Лучше подходят, кажется, вложенные диапазоны. И для любой таблицы в отдельности это просто Код: 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. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66.
Вторая процедура.... писать её для каждого справочника не хочется. В конце концов она одна и та же, с точностью до - table name, id column name and type, parent id column name, left-bound and right-bound column names т.е. можно добавить в неё еще один входящий параметр - текст её тела в виде строки - и пусть она сама себе вызывает рекурсивно через Execute Statement.... но как-то это очень хитровыподвернуто И вот тут бы какое-нибудь временно-объявленное тело по аналогии с CTE бы хорошо подошло with statement ..... as TempRecursiveSP do begin execute procedure TempRecursiveSP end; или with block ..... as TempRecursiveSP do begin execute procedure TempRecursiveSP end; ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2016, 13:25 |
|
Common Procedure Expressions
|
|||
---|---|---|---|
#18+
исходный пост и первый комментарий - 19804570 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2016, 13:46 |
|
Common Procedure Expressions
|
|||
---|---|---|---|
#18+
в oracle 12 есть with function выглядит это примерно так: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
мы бы тоже моли расширить наш DSQL так чтобы можно было писать WITH {PROCEDURE | FUNCTION} Если есть желание делай тикет в трекере на новую фичу З.Ы. Насчёт WITH STATMENT в топку ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2016, 13:46 |
|
Common Procedure Expressions
|
|||
---|---|---|---|
#18+
Симонов ДенисЕсли есть желание делай тикет в трекере на новую фичу Желание-то есть, только сначала обсудить надо, как его делать ,как его не делать, чтобы в трекер было что писать кроме ссылки на форум Симонов ДенисЕсли есть желание делай тикет в трекере на новую фичу Желание-то есть, только сначала обсудить надо, как его делать ,как его не делать, чтобы в трекер было что писать кроме ссылки на форум[/quote] [quote Arioch]Симонов Денисwith function выглядит это примерно так: в этом пpимере функций то ли не может в рекурсию, то ли не показано Симонов ДенисWITH STATMENT в топку не принципиально with block или with function вполне может состоять из execute statement тут фишка в создании тела процедуры на лету, то есть в качестве параметров чтобы передавалась таблица и столбцы и тут либо вводить в PSQL типы "столбец" и "таблица", либо таки создавтаь тело как VARCHAR ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2016, 13:51 |
|
Common Procedure Expressions
|
|||
---|---|---|---|
#18+
ну либо делать, чтобы EXECUTE STATEMENT препарировался только при первом вызове, а не при повторных но с точки зрения реализации.... делать "унутре неонку", чтобы к каждому varchar переменному подвязывать BLR-кэш.... Бррр.... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2016, 13:54 |
|
Common Procedure Expressions
|
|||
---|---|---|---|
#18+
Ariochну либо делать, чтобы EXECUTE STATEMENT препарировался только при первом вызове, а не при повторных А разве не так происходит? Трейс говорит что один раз препарится. По теме, вместо with function приходится делать execute block с suspend-ом и локальной функцией. Отсутствие lateral обходится аналогичным способом. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2016, 14:33 |
|
Common Procedure Expressions
|
|||
---|---|---|---|
#18+
afgmОтсутствие lateral ? afgmА разве не так происходит? Трейс говорит что один раз препарится. Там может быть кэш запросов.... а может не быть, хз... Implementation detail, на которую не хочется завязываться. И которую пока никто из гуру не подтвердил. Плюс к тому надо придумать, что делать с рекурсивностью в данном случае. Может быть и ничего, кэшу пофигу пока текст запроса не менялся. А м.б. и нет.... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2016, 14:42 |
|
Common Procedure Expressions
|
|||
---|---|---|---|
#18+
Симонов Дениснадежда на то что lateral появится в Firebird 4.0 CORE-3435 ага, кажется понял, внесение контекста внутрь derived ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2016, 14:45 |
|
Common Procedure Expressions
|
|||
---|---|---|---|
#18+
AriochТам может быть кэш запросов.... а может не быть, хз...Небольшой кеш есть AriochImplementation detail, на которую не хочется завязываться.И правильно AriochИ которую пока никто из гуру не подтвердилПотому что AriochImplementation detail, на которую не хочется завязываться ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2016, 15:01 |
|
Common Procedure Expressions
|
|||
---|---|---|---|
#18+
hvlad, ну вот это же тоже ответ, что "препарируется столько раз, сколько повезёт" :-) а чтобы не завязыватсья - надо эту практику лeгализовать в связи с чем таки в тред призываются разрабы, для обсуждаения желаемого и возможного и от синтаксиса и от реализации с моей стороны хотелки : 1) рекурсия такого блока, желательно прямая, хотя в крайнем случае и через прокладку из вторичной функции сойдет 2) возможность передать в параметры relation и column напрямую, а не как строковой литерал для сборки execute statement ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2016, 15:09 |
|
Common Procedure Expressions
|
|||
---|---|---|---|
#18+
товарищи гуру, господа птицеводы... какие-то осмысленные замечания будут? а то ж я дуриком-то тикет составлю и будем там как дураки по-английски обсуждать, когда можно бы было по-русски ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2016, 14:48 |
|
Common Procedure Expressions
|
|||
---|---|---|---|
#18+
Arioch, я свои уже высказал. Мне кажется надо делать похоже на Oracle (WITH PROCEDURE, WITH FUNCTION). Только фичу с WITH STATEMENT в топку. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2016, 14:53 |
|
Common Procedure Expressions
|
|||
---|---|---|---|
#18+
Ariochкакие-то осмысленные замечания будут?А где осмысленное и конкретное предложение ? Без воды и философии ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2016, 15:14 |
|
Common Procedure Expressions
|
|||
---|---|---|---|
#18+
hvlad, в таком виде пойдёт? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
пример использования Код: plsql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2016, 15:33 |
|
Common Procedure Expressions
|
|||
---|---|---|---|
#18+
Симонов Денис, пойдёт. Только не понятно кто и когда этим сможет заняться ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2016, 15:37 |
|
|
start [/forum/topic.php?fid=40&tid=1561899]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
53ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
3ms |
others: | 316ms |
total: | 475ms |
0 / 0 |