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

можно ли в хранимой процедуре в 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
10.04.2017, 11:28
    #39435718
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
цикл по результатам select запроса в хранимой процедуре
r00xus,

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


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

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

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

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

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

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

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

Большинство ERP-систем используют именно построчно-навигационную обработку. Тоже ленятся. :)
ну вы для начала осознайте на что же влияет курсор, кроме вашего единственного параметра "дольше" потом обсудим.
Про ERP отдельная радость, в большинстве своём написано под унифицированные решения которые масштабируются непрогнозируемо и построчная обработка приходит как вынужденное решение ибо там закладывают моножественность решения. И да в большинстве своём когда они вырастают до размеров среднего завода-парохода, все приходят и говорят у нас это не считается за сутки...
...
Рейтинг: 0 / 0
11.04.2017, 10:18
    #39436336
Penner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
цикл по результатам select запроса в хранимой процедуре
Код: 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
11.04.2017, 18:19
    #39436731
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
цикл по результатам select запроса в хранимой процедуре
эндиА почему собственно, вот скажем есть у меня хранимка которая делает с счетом какие-то действия по коду счета. Теперь мне надо обработать все счета, выбранные по какому-то алгоритму.
Логично сделать курсор с выбором кодов счетов и сделать вызов хранимки обрабатывающей счет по его коду.
Или я чего-то не понимаю и Вы имеете ввиду что-то другое?Почему нелогично сделать процедуру, которая сделает "что то" сразу с группой счетов?
Если операция возможна над множеством, зачем делать эту операцию над каждым элементом множества?
Не делайте процедуры, которые в состоянии работать только с одним элементом.
Это как бы общий подход.

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

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

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

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


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