powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / SQL Foreach
14 сообщений из 14, страница 1 из 1
SQL Foreach
    #39955419
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А нет в SQL какого-нибудь аналога FOREACH?
Грубо говоря - взять каждую строку таблицы, произвести с ней некоторые операции (вычисления полей) и засунуть новые значения обратно в эту строку. И так для каждой строки. Причем операции разные, в зависимости от данных в строке.

И второй вопрос: что-то похожее, как я понимаю, делают курсоры. Но на СО почему-то к ответу про курсор (правда для другой БД) написано что надо всячески избегать их использования, т.к. они тормознутые. Как с этим в ФБ?
...
Рейтинг: 0 / 0
SQL Foreach
    #39955422
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

В ФБ курсоры не тормозные, по крайней мере обычные. Двунаправленные будут жрать память, но они нужны крайне редко.
...
Рейтинг: 0 / 0
SQL Foreach
    #39955427
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
А нет в SQL какого-нибудь аналога FOREACH
SELECT

alekcvp
взять каждую строку таблицы, произвести с ней некоторые операции (вычисления полей) и засунуть новые значения обратно в эту строку
UPDATE

Сюрприз ?
...
Рейтинг: 0 / 0
SQL Foreach
    #39955428
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

собственно, "однонаправленный курсор" это обычный select (сюрприз). Тормозным он не может (и не должен) быть по определению.
Под "тормозными курсорами" имееются в виду двунаправленные курсоры, в которых допускается позиционирование, то есть, где-то в памяти надо держать результат, по которому программист будет елозить туда-сюда, что потребляет ресурсы и тормозит выполнение.

И то, действительно, "тормознутость" зависит от места применения.

Короче, курсоры это
- результат select на клиентской стороне
- for select в процедурах и триггерах (в т.ч. for select ... as cursor)
- declare cursor в процедурах и триггерах

описание всех этих курсоров во всех версиях ФБ, на русском языке, тут - http://www.ibase.ru/develop/
...
Рейтинг: 0 / 0
SQL Foreach
    #39955430
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv

Короче, курсоры это
- результат select на клиентской стороне
- for select в процедурах и триггерах (в т.ч. for select ... as cursor)
- declare cursor в процедурах и триггерах

Ну то есть если я в ХП запихну код типа:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
for select .... from sometable where .... into .... as cursor cn do
begin
  if .... then
    update sometable set field1 = ...., field2 = ...., where current of cn;
  else 
    update sometable set field3 = ...., field4 = ...., where current of cn;
end;


Это нормальный подход? С учётом что эта процедура должна будет один раз в день выполняться на нескольких [десятках] тысячах записей?
...
Рейтинг: 0 / 0
SQL Foreach
    #39955431
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpНо на СО почему-то к ответу про курсор (правда для другой БД) написано что надо всячески
избегать их использования, т.к. они тормознутые.

Да, у MS SQL они тормозные. Но это его личные тараканы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
SQL Foreach
    #39955432
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpЭто нормальный подход?

Это единственно работоспособный подход.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
SQL Foreach
    #39955433
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpС учётом что эта процедура должна будет один раз в день выполняться на нескольких [десятках] тысячах записей?
основной вопрос при таком использовании курсоров, это "стабильность курсора", т.е. остается-ли изменяемая запись в той же области видимости курсора, или выпадает оттуда, или меняется порядок записей курсора, и т.д.
А это уже зависит от типа запроса и версии ФБ.
Если используется версия ФБ где for select "нестабилен" в отношении update/delete себя, то там к запросу надо добавлять такой order by, чтобы у запроса был plan sort, т.е. чтобы результат запроса был "фиксированным".

см. например https://firebirdsql.org/file/documentation/release_notes/html/en/3_0/bk01ch09s06.html#rnfb30-dml-curstability

однако, для for select ... suspend всё равно "стабильности" нет.
https://firebirdsql.org/file/documentation/release_notes/html/en/3_0/rnfb30-psql-cursor-stablility.html
...
Рейтинг: 0 / 0
SQL Foreach
    #39955435
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
основной вопрос при таком использовании курсоров, это "стабильность курсора", т.е. остается-ли изменяемая запись в той же области видимости курсора, или выпадает оттуда, или меняется порядок записей курсора, и т.д.
А это уже зависит от типа запроса и версии ФБ.
Если используется версия ФБ где for select "нестабилен" в отношении update/delete себя, то там к запросу надо добавлять такой order by, чтобы у запроса был plan sort, т.е. чтобы результат запроса был "фиксированным".

Версия 3.0.5, ЕМНИП. UPDATE построен таким образом, что после его выполнения эта запись больше не подходит под условие WHERE в FOR SELECT. Т.е. в моём случае этот нюанс не опасен, я правильно понимаю? Или он может начать пропускать записи?
ORDER BY и SUSPEND не используются.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
for select .... from sometable where last_ref < current_date into .... as cursor cn do
begin
  if .... then
    update sometable set field1 = ...., field2 = ...., last_ref = current_date where current of cn;
  else 
    update sometable set field3 = ...., field4 = ...., last_ref = current_date where current of cn;
end;
...
Рейтинг: 0 / 0
SQL Foreach
    #39955437
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

не опасен, там же написано
"From Firebird 3, engine uses the Undo log to check whether a row was already inserted or modified by the current cursor."
...
Рейтинг: 0 / 0
SQL Foreach
    #39955438
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

Спасибо за информацию.
...
Рейтинг: 0 / 0
SQL Foreach
    #39955489
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Это нормальный подход?
Ещё почитай применение MERGE.
В примере, который написан, оно даже лучше зайдёт. А там уже в зависимости от сложности предполагаемой процедуры.
...
Рейтинг: 0 / 0
SQL Foreach
    #39955498
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery
Ещё почитай применение MERGE.
В примере, который написан, оно даже лучше зайдёт. А там уже в зависимости от сложности предполагаемой процедуры.

У меня в if стороннее значение используется, кроме того все операции в одной таблице выполняются над каждой строкой независимо (от других строк).
Разве merge в этом случае не медленнее будет?
...
Рейтинг: 0 / 0
SQL Foreach
    #39955607
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
У меня в if стороннее значение используется
Это ничего. Там очень гибкий синтаксис.

alekcvp
Разве merge в этом случае не медленнее будет?
По крайней мере сравнимо с курсором.
Если в процедуре будут какие-то дополнительные выборки, которые можно в USING для MERGE поместить, то может и быстрее.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / SQL Foreach
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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