powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / цикл по результатам select запроса в хранимой процедуре
25 сообщений из 31, страница 1 из 2
цикл по результатам select запроса в хранимой процедуре
    #39435715
r00xus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
здравствуйте коллеги.

можно ли в хранимой процедуре в MS Sql Server использовать анонимный курсор для цикла по результатам select.

В Oracle это выглядело бы так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
BEGIN
  FOR s_line IN
  (
    SELECT * 
    FROM
      some_table
  )
  LOOP
    -- обработка
  END LOOP;
END;


В Firebird так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
for
    select
       id,
       name
    from
       some_table
    into
       :l_id,
       :l_name
do
begin
   -- обработка
end;


а все что я нашел в MS Sql Server это явное объявление курсора что очень громоздко. Есть ли что-то подобное Oracle или Firebird?
...
Рейтинг: 0 / 0
цикл по результатам select запроса в хранимой процедуре
    #39435718
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r00xus,

я бы сказал, что в ms sql подход построчной обработки это исключение, а не норма.
...
Рейтинг: 0 / 0
цикл по результатам select запроса в хранимой процедуре
    #39435791
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по сабжу: можно :)
Кидаем ресултсет во времянку.
В цикле while получаем оттуда по одной записи (top 1),
обрабатываем,
удаляем эту запись, чтоб повторно не попала.
и т.д.
(профит)


но это извращение или глупая задача для собеседования. Зато анонимно и даже без курсора. бгг....
...
Рейтинг: 0 / 0
цикл по результатам select запроса в хранимой процедуре
    #39435794
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LSV,

аж больно стало от такого варианта :)
...
Рейтинг: 0 / 0
цикл по результатам select запроса в хранимой процедуре
    #39435868
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r00xusвсе что я нашел в MS Sql Server это явное объявление курсора что очень громоздко.Ну, не такое уж громоздкое :-)

Да, как уже написали, MSSQL - это РСУБД, в нём принято делать операции над множествами.
Синтаксис циклов типа оракловского, и, не дай бог, построчные триггеры, сразу приведёт к тоннам говнокода и ошибкам.
...
Рейтинг: 0 / 0
цикл по результатам select запроса в хранимой процедуре
    #39435917
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему собственно, вот скажем есть у меня хранимка которая делает с счетом какие-то действия по коду счета. Теперь мне надо обработать все счета, выбранные по какому-то алгоритму.
Логично сделать курсор с выбором кодов счетов и сделать вызов хранимки обрабатывающей счет по его коду.
Или я чего-то не понимаю и Вы имеете ввиду что-то другое?
...
Рейтинг: 0 / 0
цикл по результатам select запроса в хранимой процедуре
    #39435921
waszkiewicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
энди,
логично такую бизнес-логику вынести с сервера данных на сервер приложений
...
Рейтинг: 0 / 0
цикл по результатам select запроса в хранимой процедуре
    #39435928
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да с чего бы это? У меня тонкий клиент в котором бизнес-логики никакой, приложение не более чем оболочка для отображения данных и не более.
...
Рейтинг: 0 / 0
цикл по результатам select запроса в хранимой процедуре
    #39435933
waszkiewicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
энди,
И каким боком тут тонкий клиент? Ему религия не позволяет на сервер приложений обращаться? Только сервер данных долбить разрешено?
...
Рейтинг: 0 / 0
цикл по результатам select запроса в хранимой процедуре
    #39435944
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем плодить сущности без необходимост?. Вот у меня клиент писанный на Delphi XE7 + SDAC (компоненты доступа). Работаем напрямую с БД. Пользователь выполняет каку-то операцию передавая на сервер параметры запуска для некоей хранимой процедуры, запускаем цикл по выборке построенной с помощью переданных параметров и натравливаем на каждую строку выборки необходимую для обработки одной строки выборки хранимую процедуру. Вопрос, зачем мне тут сервер приложений?
Хранимая процедура прекрасно заменит мне сервер приложений. Меньше кода, проще поддержка.
...
Рейтинг: 0 / 0
цикл по результатам select запроса в хранимой процедуре
    #39435957
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эндиЗачем плодить сущности без необходимост?. Вот у меня клиент писанный на Delphi XE7 + SDAC (компоненты доступа). Работаем напрямую с БД. Пользователь выполняет каку-то операцию передавая на сервер параметры запуска для некоей хранимой процедуры, запускаем цикл по выборке построенной с помощью переданных параметров и натравливаем на каждую строку выборки необходимую для обработки одной строки выборки хранимую процедуру. Вопрос, зачем мне тут сервер приложений?
Хранимая процедура прекрасно заменит мне сервер приложений. Меньше кода, проще поддержка.+500. СП не нужен.
...
Рейтинг: 0 / 0
цикл по результатам select запроса в хранимой процедуре
    #39435962
Dmitry V. Liseev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эндизапускаем цикл по выборкеПотому, что при миллиарде записей и тысяче процессорных ядер такой цикл будет обрабатывать записи последовательно по одной на одном ядре. А железо будет простаивать. А правильный тру реляционный программист пишет запросы без циклов и курсоров. И тогда ядро СУБД сможет автоматически распараллелить запрос по процессорным ядрам и NUMA блокам.
...
Рейтинг: 0 / 0
цикл по результатам select запроса в хранимой процедуре
    #39435967
hoolygan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
энди, смотря для чего хранимка писалась, и что должна впоследствии возвращать. Ситуации разные. Может быть был смысл писать не на курсорах, а использовать временную таблицу для списка счетов, а потом вызывать функцию на каждом значении временной таблички, в которую передавать счет, а на выходе иметь результат. И тогда безо всяких циклов/курсоров. ИМХО
...
Рейтинг: 0 / 0
цикл по результатам select запроса в хранимой процедуре
    #39435968
waszkiewicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LSV,

Мыслить построчно в РСУБД вредно
...
Рейтинг: 0 / 0
цикл по результатам select запроса в хранимой процедуре
    #39435972
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И тогда безо всяких циклов/курсоровРечь шла об использовании больших массивов уже готового отлаженного кода (ХП). И важно, что этот код в одном месте. Если его надо поправить, то только тут. И изучать только его, а не его многочисленные клоны в куче мест большого проекта. И то если удастся эти клоны найти, что не факт.

Все это может быть гораздо важнее производительности.
...
Рейтинг: 0 / 0
цикл по результатам select запроса в хранимой процедуре
    #39435979
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot LSV]Все это может быть гораздо важнее производительности. лень разработчика важнее производительности, я правильно понимаю?

и в глобальном плане ваши "массивов уже готового отлаженного кода (ХП)" надо научить/переписать для работы как с одной строкой так и с 1000 без курсоров и простите "WHILE + DELETE TOP (1) " и MS SQL <> ORACLE и в любой книге вам будет сразу написано "работайте с множествами в отличии от oracle" ну как-то так :)
...
Рейтинг: 0 / 0
цикл по результатам select запроса в хранимой процедуре
    #39435982
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет абсолютного зла (тригеры, курсоры ...), важен контекст.
иногда, действительно нужно построчно вызывать процедуру
ну и не стоит забывать, что производительность t-sql, скажем так, ортогональна "красоте кода", имхо.
...
Рейтинг: 0 / 0
цикл по результатам select запроса в хранимой процедуре
    #39435993
Dmitry V. Liseev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LSVВсе это может быть гораздо важнее производительности.Ну, таки надо смотреть по ситуации. У нас система от вендора, где всё на курсорах. Мы её загрузили настолько плотно, что весь этот код в критичных местах пришлось переписать. Иначе тяжело взлетало.
...
Рейтинг: 0 / 0
цикл по результатам select запроса в хранимой процедуре
    #39436195
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я просто к тому что не надо оголтело писать курсоры зло, курсоры не зло, а вполне себе решение. Другое дело как их использовать.
Я как-то видел такое решение, как вспомню так вздрогну, система была реализована на C#, EF и SQL Server. 2 таблицы, список счетов и список записей в счетах, классический master-detail. В итоге на профайлере я наблюдаю картину от которой у меня волосы на голове начинают шевелится. Сначала идет запрос на список счетов, а затем на каждый счет клиент отправляет на сервер запрос типа select count(*) from reestr where schet_id= :schet_id и так 10 тысяч раз. Потому как счетов на клиента упало 10 тысяч :)
И ведь я не могу сказать что EF такая уж плохая вещь, важно то как ты используешь тот или иной инструмент.
...
Рейтинг: 0 / 0
цикл по результатам select запроса в хранимой процедуре
    #39436199
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, да, забыл написать какую задачу решали с помощью подобного изврата, надо было отобразить список счетов с количеством записей в каждом :)
...
Рейтинг: 0 / 0
цикл по результатам select запроса в хранимой процедуре
    #39436296
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лень разработчика важнее производительности, я правильно понимаю?Неправильно. Грамотный разработчик сначала все взвесит. Если массивный запрос с курсором дольше на 5%, то его можно применять, если это действительно упрощает/унифицирует код.
Самые быстрые и компактные программы - на ассемблере (теоретически конеш).
Но почти никто не пишет на асме. Потому что леняться. :)

Большинство ERP-систем используют именно построчно-навигационную обработку. Тоже ленятся. :)
...
Рейтинг: 0 / 0
цикл по результатам select запроса в хранимой процедуре
    #39436299
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LSVлень разработчика важнее производительности, я правильно понимаю?Неправильно. Грамотный разработчик сначала все взвесит. Если массивный запрос с курсором дольше на 5%, то его можно применять, если это действительно упрощает/унифицирует код.
Самые быстрые и компактные программы - на ассемблере (теоретически конеш).
Но почти никто не пишет на асме. Потому что леняться. :)

Большинство ERP-систем используют именно построчно-навигационную обработку. Тоже ленятся. :)
ну вы для начала осознайте на что же влияет курсор, кроме вашего единственного параметра "дольше" потом обсудим.
Про ERP отдельная радость, в большинстве своём написано под унифицированные решения которые масштабируются непрогнозируемо и построчная обработка приходит как вынужденное решение ибо там закладывают моножественность решения. И да в большинстве своём когда они вырастают до размеров среднего завода-парохода, все приходят и говорят у нас это не считается за сутки...
...
Рейтинг: 0 / 0
цикл по результатам select запроса в хранимой процедуре
    #39436336
Penner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
DECLARE @id INT
, @Name nvarchar(20)

DECLARE @cur CURSOR

SET @cur = CURSOR
FOR
SELECT	id                  
	,Name
FROM    some_table
FOR READ ONLY

FETCH NEXT
FROM @cur
INTO @ID
,@Name

WHILE @@fetch_status = 0
BEGIN
...

	FETCH NEXT
	FROM @cur
	INTO @ID
	,@Name

END

CLOSE @cur

DEALLOCATE @cur
...
Рейтинг: 0 / 0
цикл по результатам select запроса в хранимой процедуре
    #39436731
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эндиА почему собственно, вот скажем есть у меня хранимка которая делает с счетом какие-то действия по коду счета. Теперь мне надо обработать все счета, выбранные по какому-то алгоритму.
Логично сделать курсор с выбором кодов счетов и сделать вызов хранимки обрабатывающей счет по его коду.
Или я чего-то не понимаю и Вы имеете ввиду что-то другое?Почему нелогично сделать процедуру, которая сделает "что то" сразу с группой счетов?
Если операция возможна над множеством, зачем делать эту операцию над каждым элементом множества?
Не делайте процедуры, которые в состоянии работать только с одним элементом.
Это как бы общий подход.

Разумеется, иногда необходимо делать операции над отдельными элементами, но реально это редкость, типа, для каждой записи делать что то снаружи, например, обратиться к сайту и что то там сделать.

И возможность делать "простые перечисления" будут сильно провоцировать писать криво, особенно программистов, пришедших с других языков.
...
Рейтинг: 0 / 0
цикл по результатам select запроса в хранимой процедуре
    #39436738
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эндиЯ просто к тому что не надо оголтело писать курсоры зло, курсоры не зло, а вполне себе решение. Другое дело как их использовать.Да, правильно.
Но я и не пишу, что это однозначное зло.

Вот, в C# есть битовые операции, но никто же не использует их для обработки целых и плавающих чисел, потому что это неестественно, для этого есть операции с соотв. типами данных.

И тут так же. В системе хранения и обработки множеств естественно оперировать именно множествами, работая с "отдельными битами" только в специальных случаях.
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / цикл по результатам select запроса в хранимой процедуре
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]