Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
цикл по результатам select запроса в хранимой процедуре
|
|||
|---|---|---|---|
|
#18+
здравствуйте коллеги. можно ли в хранимой процедуре в MS Sql Server использовать анонимный курсор для цикла по результатам select. В Oracle это выглядело бы так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. В Firebird так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. а все что я нашел в MS Sql Server это явное объявление курсора что очень громоздко. Есть ли что-то подобное Oracle или Firebird? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2017, 11:24 |
|
||
|
цикл по результатам select запроса в хранимой процедуре
|
|||
|---|---|---|---|
|
#18+
r00xus, я бы сказал, что в ms sql подход построчной обработки это исключение, а не норма. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2017, 11:28 |
|
||
|
цикл по результатам select запроса в хранимой процедуре
|
|||
|---|---|---|---|
|
#18+
по сабжу: можно :) Кидаем ресултсет во времянку. В цикле while получаем оттуда по одной записи (top 1), обрабатываем, удаляем эту запись, чтоб повторно не попала. и т.д. (профит) но это извращение или глупая задача для собеседования. Зато анонимно и даже без курсора. бгг.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2017, 13:30 |
|
||
|
цикл по результатам select запроса в хранимой процедуре
|
|||
|---|---|---|---|
|
#18+
LSV, аж больно стало от такого варианта :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2017, 13:32 |
|
||
|
цикл по результатам select запроса в хранимой процедуре
|
|||
|---|---|---|---|
|
#18+
r00xusвсе что я нашел в MS Sql Server это явное объявление курсора что очень громоздко.Ну, не такое уж громоздкое :-) Да, как уже написали, MSSQL - это РСУБД, в нём принято делать операции над множествами. Синтаксис циклов типа оракловского, и, не дай бог, построчные триггеры, сразу приведёт к тоннам говнокода и ошибкам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2017, 14:41 |
|
||
|
цикл по результатам select запроса в хранимой процедуре
|
|||
|---|---|---|---|
|
#18+
А почему собственно, вот скажем есть у меня хранимка которая делает с счетом какие-то действия по коду счета. Теперь мне надо обработать все счета, выбранные по какому-то алгоритму. Логично сделать курсор с выбором кодов счетов и сделать вызов хранимки обрабатывающей счет по его коду. Или я чего-то не понимаю и Вы имеете ввиду что-то другое? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2017, 15:22 |
|
||
|
цикл по результатам select запроса в хранимой процедуре
|
|||
|---|---|---|---|
|
#18+
энди, логично такую бизнес-логику вынести с сервера данных на сервер приложений ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2017, 15:24 |
|
||
|
цикл по результатам select запроса в хранимой процедуре
|
|||
|---|---|---|---|
|
#18+
Да с чего бы это? У меня тонкий клиент в котором бизнес-логики никакой, приложение не более чем оболочка для отображения данных и не более. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2017, 15:29 |
|
||
|
цикл по результатам select запроса в хранимой процедуре
|
|||
|---|---|---|---|
|
#18+
энди, И каким боком тут тонкий клиент? Ему религия не позволяет на сервер приложений обращаться? Только сервер данных долбить разрешено? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2017, 15:33 |
|
||
|
цикл по результатам select запроса в хранимой процедуре
|
|||
|---|---|---|---|
|
#18+
Зачем плодить сущности без необходимост?. Вот у меня клиент писанный на Delphi XE7 + SDAC (компоненты доступа). Работаем напрямую с БД. Пользователь выполняет каку-то операцию передавая на сервер параметры запуска для некоей хранимой процедуры, запускаем цикл по выборке построенной с помощью переданных параметров и натравливаем на каждую строку выборки необходимую для обработки одной строки выборки хранимую процедуру. Вопрос, зачем мне тут сервер приложений? Хранимая процедура прекрасно заменит мне сервер приложений. Меньше кода, проще поддержка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2017, 15:41 |
|
||
|
цикл по результатам select запроса в хранимой процедуре
|
|||
|---|---|---|---|
|
#18+
эндиЗачем плодить сущности без необходимост?. Вот у меня клиент писанный на Delphi XE7 + SDAC (компоненты доступа). Работаем напрямую с БД. Пользователь выполняет каку-то операцию передавая на сервер параметры запуска для некоей хранимой процедуры, запускаем цикл по выборке построенной с помощью переданных параметров и натравливаем на каждую строку выборки необходимую для обработки одной строки выборки хранимую процедуру. Вопрос, зачем мне тут сервер приложений? Хранимая процедура прекрасно заменит мне сервер приложений. Меньше кода, проще поддержка.+500. СП не нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2017, 15:48 |
|
||
|
цикл по результатам select запроса в хранимой процедуре
|
|||
|---|---|---|---|
|
#18+
эндизапускаем цикл по выборкеПотому, что при миллиарде записей и тысяче процессорных ядер такой цикл будет обрабатывать записи последовательно по одной на одном ядре. А железо будет простаивать. А правильный тру реляционный программист пишет запросы без циклов и курсоров. И тогда ядро СУБД сможет автоматически распараллелить запрос по процессорным ядрам и NUMA блокам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2017, 15:49 |
|
||
|
цикл по результатам select запроса в хранимой процедуре
|
|||
|---|---|---|---|
|
#18+
энди, смотря для чего хранимка писалась, и что должна впоследствии возвращать. Ситуации разные. Может быть был смысл писать не на курсорах, а использовать временную таблицу для списка счетов, а потом вызывать функцию на каждом значении временной таблички, в которую передавать счет, а на выходе иметь результат. И тогда безо всяких циклов/курсоров. ИМХО ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2017, 15:54 |
|
||
|
цикл по результатам select запроса в хранимой процедуре
|
|||
|---|---|---|---|
|
#18+
LSV, Мыслить построчно в РСУБД вредно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2017, 15:55 |
|
||
|
цикл по результатам select запроса в хранимой процедуре
|
|||
|---|---|---|---|
|
#18+
И тогда безо всяких циклов/курсоровРечь шла об использовании больших массивов уже готового отлаженного кода (ХП). И важно, что этот код в одном месте. Если его надо поправить, то только тут. И изучать только его, а не его многочисленные клоны в куче мест большого проекта. И то если удастся эти клоны найти, что не факт. Все это может быть гораздо важнее производительности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2017, 16:01 |
|
||
|
цикл по результатам select запроса в хранимой процедуре
|
|||
|---|---|---|---|
|
#18+
[quot LSV]Все это может быть гораздо важнее производительности. лень разработчика важнее производительности, я правильно понимаю? и в глобальном плане ваши "массивов уже готового отлаженного кода (ХП)" надо научить/переписать для работы как с одной строкой так и с 1000 без курсоров и простите "WHILE + DELETE TOP (1) " и MS SQL <> ORACLE и в любой книге вам будет сразу написано "работайте с множествами в отличии от oracle" ну как-то так :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2017, 16:07 |
|
||
|
цикл по результатам select запроса в хранимой процедуре
|
|||
|---|---|---|---|
|
#18+
нет абсолютного зла (тригеры, курсоры ...), важен контекст. иногда, действительно нужно построчно вызывать процедуру ну и не стоит забывать, что производительность t-sql, скажем так, ортогональна "красоте кода", имхо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2017, 16:09 |
|
||
|
цикл по результатам select запроса в хранимой процедуре
|
|||
|---|---|---|---|
|
#18+
LSVВсе это может быть гораздо важнее производительности.Ну, таки надо смотреть по ситуации. У нас система от вендора, где всё на курсорах. Мы её загрузили настолько плотно, что весь этот код в критичных местах пришлось переписать. Иначе тяжело взлетало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2017, 16:17 |
|
||
|
цикл по результатам select запроса в хранимой процедуре
|
|||
|---|---|---|---|
|
#18+
Я просто к тому что не надо оголтело писать курсоры зло, курсоры не зло, а вполне себе решение. Другое дело как их использовать. Я как-то видел такое решение, как вспомню так вздрогну, система была реализована на C#, EF и SQL Server. 2 таблицы, список счетов и список записей в счетах, классический master-detail. В итоге на профайлере я наблюдаю картину от которой у меня волосы на голове начинают шевелится. Сначала идет запрос на список счетов, а затем на каждый счет клиент отправляет на сервер запрос типа select count(*) from reestr where schet_id= :schet_id и так 10 тысяч раз. Потому как счетов на клиента упало 10 тысяч :) И ведь я не могу сказать что EF такая уж плохая вещь, важно то как ты используешь тот или иной инструмент. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2017, 22:58 |
|
||
|
цикл по результатам select запроса в хранимой процедуре
|
|||
|---|---|---|---|
|
#18+
А, да, забыл написать какую задачу решали с помощью подобного изврата, надо было отобразить список счетов с количеством записей в каждом :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2017, 23:03 |
|
||
|
цикл по результатам select запроса в хранимой процедуре
|
|||
|---|---|---|---|
|
#18+
лень разработчика важнее производительности, я правильно понимаю?Неправильно. Грамотный разработчик сначала все взвесит. Если массивный запрос с курсором дольше на 5%, то его можно применять, если это действительно упрощает/унифицирует код. Самые быстрые и компактные программы - на ассемблере (теоретически конеш). Но почти никто не пишет на асме. Потому что леняться. :) Большинство ERP-систем используют именно построчно-навигационную обработку. Тоже ленятся. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2017, 09:19 |
|
||
|
цикл по результатам select запроса в хранимой процедуре
|
|||
|---|---|---|---|
|
#18+
LSVлень разработчика важнее производительности, я правильно понимаю?Неправильно. Грамотный разработчик сначала все взвесит. Если массивный запрос с курсором дольше на 5%, то его можно применять, если это действительно упрощает/унифицирует код. Самые быстрые и компактные программы - на ассемблере (теоретически конеш). Но почти никто не пишет на асме. Потому что леняться. :) Большинство ERP-систем используют именно построчно-навигационную обработку. Тоже ленятся. :) ну вы для начала осознайте на что же влияет курсор, кроме вашего единственного параметра "дольше" потом обсудим. Про ERP отдельная радость, в большинстве своём написано под унифицированные решения которые масштабируются непрогнозируемо и построчная обработка приходит как вынужденное решение ибо там закладывают моножественность решения. И да в большинстве своём когда они вырастают до размеров среднего завода-парохода, все приходят и говорят у нас это не считается за сутки... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2017, 09:25 |
|
||
|
цикл по результатам select запроса в хранимой процедуре
|
|||
|---|---|---|---|
|
#18+
Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2017, 10:18 |
|
||
|
цикл по результатам select запроса в хранимой процедуре
|
|||
|---|---|---|---|
|
#18+
эндиА почему собственно, вот скажем есть у меня хранимка которая делает с счетом какие-то действия по коду счета. Теперь мне надо обработать все счета, выбранные по какому-то алгоритму. Логично сделать курсор с выбором кодов счетов и сделать вызов хранимки обрабатывающей счет по его коду. Или я чего-то не понимаю и Вы имеете ввиду что-то другое?Почему нелогично сделать процедуру, которая сделает "что то" сразу с группой счетов? Если операция возможна над множеством, зачем делать эту операцию над каждым элементом множества? Не делайте процедуры, которые в состоянии работать только с одним элементом. Это как бы общий подход. Разумеется, иногда необходимо делать операции над отдельными элементами, но реально это редкость, типа, для каждой записи делать что то снаружи, например, обратиться к сайту и что то там сделать. И возможность делать "простые перечисления" будут сильно провоцировать писать криво, особенно программистов, пришедших с других языков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2017, 18:19 |
|
||
|
цикл по результатам select запроса в хранимой процедуре
|
|||
|---|---|---|---|
|
#18+
эндиЯ просто к тому что не надо оголтело писать курсоры зло, курсоры не зло, а вполне себе решение. Другое дело как их использовать.Да, правильно. Но я и не пишу, что это однозначное зло. Вот, в C# есть битовые операции, но никто же не использует их для обработки целых и плавающих чисел, потому что это неестественно, для этого есть операции с соотв. типами данных. И тут так же. В системе хранения и обработки множеств естественно оперировать именно множествами, работая с "отдельными битами" только в специальных случаях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2017, 18:24 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39435962&tid=1689756]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
53ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 217ms |
| total: | 373ms |

| 0 / 0 |
