powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
14 сообщений из 14, страница 1 из 1
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
    #39990471
арт2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть некая процедура с одном входным параметром - ostatok_na_date(:d1). Надо обновить некоторые строки ее результата. Но она сложная, поэтому код ее самой я менять не хочу. Создал еще одну процедуру где вызываю ее:

Код: sql
1.
2.
3.
4.
5.
6.
7.
begin
select  ond.kod1c, ond.prihod, ond.idtovar, ond.idproizv, ond.idserii, ond.dateost,
   (ond.ostatok - dm.kolvo), ond.cenaopt, ond.cena, ond.goden_do, ond.barcode,  ond.inn, ond.naklad, ond.hide
  from ostatok_na_date(:d1) as ond left outer join datam as dm on (ond.kod1c = dm.kod1c) and (ond.idtovar = dm.id_sprtovara)
    and (ond.idproizv = dm.id_sprproizv) and (ond.idserii = dm.id_sprserii) and (ond.cenaopt = dm.cena)
  into :kod1c, :prihod, :idtovar, :idproizv, :idserii, :dateost, :ostatok, :cenaopt, :cena, :goden_do, :barcode, :inn, :naklad, :hide;
end



Ошибка - multiple rows in singleton select
При этом в обычном запросе в Ibexpert все нормально отрабатывает, только неожиданно появляется какой-то столбец subtract, заполненный Null, но это ладно
Почему в хранимке этот же код не работает?

Но вообще возможно мне нужно другое решение. По идее мне нужно нечто типа
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
begin
 merge
   into ostatok_na_date(:d1) ond
   using datam dm
   on (ond.kod1c = dm.kod1c) and (ond.idtovar = dm.id_sprtovara)
    and (ond.idproizv = dm.id_sprproizv) and (ond.idserii = dm.id_sprserii) and (ond.cenaopt = dm.cena)
   when matched then
    update set
     (ond.ostatok - dm.kolvo);
end



Но естественно так не сработает, потому что вместо ostatok_na_date(:d1) должна быть таблица, а не вызов процедуры
Но и сохранять в таблицу результат ostatok_na_date(:d1) я не могу - так как она вызывается очень часто в реальном времени и результат максимально быстро должен парситься и выводиться на экран
Подскажите пожалуйста, как мне решить эту проблему наилучшим образом?
...
Рейтинг: 0 / 0
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
    #39990476
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
арт2010,

subtract это

Код: sql
1.
(ond.ostatok - dm.kolvo)



ты же не дал выражению алиас, чтобы оно нормально называлось.

А запрос полный бред, как первый так и второй. Лучше никогда не вызывать селективную процедуру с побочными эффектами (обновление/удаление/вставка данных) в select с каким нибудь join, ибо пути оптимизатора неисповедимы и не известно сколько раз она может быть вызвана.

Для устранения multiple rows in singleton select используй

for select ....
into ...
do suspend;
...
Рейтинг: 0 / 0
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
    #39990478
арт2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,
Спасибо за ответ! Но как мне лучше всего решить проблему, чтобы добиться максимальной скорости?
Неужели кроме переписывания кода изначальной процедуры нет других приемлемых решений?
...
Рейтинг: 0 / 0
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
    #39990528
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot арт2010#22183919]
Ошибка - multiple rows in singleton select
При этом в обычном запросе в Ibexpert все нормально отрабатывает, только неожиданно появляется какой-то столбец subtract, заполненный Null, но это ладно
Почему в хранимке этот же код не работает?
[/src]

Одна из причин - в Эксперте не включена настройка "Фетчить всё".
...
Рейтинг: 0 / 0
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
    #39990532
AltHasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
арт2010,

Чтобы select возвращал только одну запись, можно использовать
Код: plsql
1.
select first 1 bla,blu from Table1 into :tra,:ta;


А лучше нанять программиста (ИМХО).
Удачи !
...
Рейтинг: 0 / 0
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
    #39990533
AltHasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
арт2010,
авторнеожиданно появляется какой-то столбец subtract, заполненный Null
Код: plsql
1.
(ond.ostatok - dm.kolvo) as MyField


и можете использовать coalesce от неожиданных Null-ов.

Удачи !
...
Рейтинг: 0 / 0
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
    #39990536
арт2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AltHasp, спасибо конечно, но ваши советы запоздали, поскольку Денис Симонов уже ответил на все вопросы.
И да, речь про выбор одной записи вообще не шла. Выбрать надо как раз таки все записи, с этим проблем уже нет
Проблема - как это сделать правильно и максимально быстро - по настоящему, по программистски!
Решение со второй процедурой и for ... select - не совсем правильное и явно не самое быстрое.
Денис Симонов же написал - лучше никогда не вызывать селективную процедуру с побочными эффектами (обновление/удаление/вставка данных) select с каким нибудь join, ибо пути оптимизатора неисповедимы и не известно сколько раз она может быть вызвана.
Вот и нужно какое-то настоящее программистское решение, которое похоже сводится к одному - модифицировать текст исходной процедуры
...
Рейтинг: 0 / 0
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
    #39990542
AltHasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
арт2010,

Мы у нас если нужно выбрать несколько записей с помощью Select - то стандартно используем ХП (for select).
Правда еще можно как курсор объявить чуток по-шустрее.
"Ускорение" - понятие растяжимое тут от многого зависит и от аппаратной части и какая версия сервера, и от правильного использования индексов. Еще можно создать представления с нужными вам условиями. Если данные огромные, то у нас фоновый процесс "раскладывает по нужным полкам" и тогда отчеты "летают". Но у нас база терабайтная...
Вообщем нет универсального совета и "секретной кнопки" ускоряющий все select-ы разом.
А что такого сложного редактировать текст вашего ХП?

Удачи !
...
Рейтинг: 0 / 0
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
    #39990543
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
18.08.2020 14:19, AltHasp пишет:
> если нужно выбрать несколько записей с помощью Select - то стандартно используем ХП (for select).

зачем?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
    #39992354
арт2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В продолжение темы - можно ли как-то на уровне процедуры отбросить строки ее результаты где значение какого-то поля = 0?
Именно результата, а не входных данных, потому что процедура считает остатки на текущий момент путем суммирования прихода со знаком + и расхода со знаком минус
Скажем я пробую так
Код: sql
1.
2.
3.
4.
5.
6.
for select ...
begin
...
ostatok = ...
if (OSTATOK = 0) then continue
end


Получаю Feature not supported (Firebird 2.5)
Или что-то типа case when (OSTATOK <> 0) только к результату?

Или же это ничего не даст в плане быстроты выполнения запроса, так все равно будут суммироваться все приходы и расходы и отсеивание строк с нулевым остатков уже на фигагльной стадии процедуры ничего не даст?
...
Рейтинг: 0 / 0
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
    #39992357
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
арт2010,

continue появился в 3.0
...
Рейтинг: 0 / 0
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
    #39992358
арт2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Либо придется идти по пути таблицы ежедневных остатков
...
Рейтинг: 0 / 0
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
    #39992360
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
арт2010
Код: sql
1.
if (OSTATOK <> 0) then suspend;

...
Рейтинг: 0 / 0
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
    #39992450
арт2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvlad, благодарю, теперь в самом приложении (Delphi) выполняется вроде быстрее, хотя Perfomance Analisys в Ibexpert утверждает, что время выполнения примерно одинаковое
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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