Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / В запросе нормально, в процедуре - multiple rows in singleton select или update результат? / 14 сообщений из 14, страница 1 из 1
18.08.2020, 10:04
    #39990471
арт2010
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
Есть некая процедура с одном входным параметром - 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
18.08.2020, 10:18
    #39990476
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
арт2010,

subtract это

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



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

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

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

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

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

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


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


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

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

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

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

зачем?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.08.2020, 17:31
    #39992354
арт2010
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
В продолжение темы - можно ли как-то на уровне процедуры отбросить строки ее результаты где значение какого-то поля = 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
25.08.2020, 17:40
    #39992357
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
арт2010,

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

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


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