|
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
|
|||
---|---|---|---|
#18+
Есть некая процедура с одном входным параметром - ostatok_na_date(:d1). Надо обновить некоторые строки ее результата. Но она сложная, поэтому код ее самой я менять не хочу. Создал еще одну процедуру где вызываю ее: Код: sql 1. 2. 3. 4. 5. 6. 7.
Ошибка - multiple rows in singleton select При этом в обычном запросе в Ibexpert все нормально отрабатывает, только неожиданно появляется какой-то столбец subtract, заполненный Null, но это ладно Почему в хранимке этот же код не работает? Но вообще возможно мне нужно другое решение. По идее мне нужно нечто типа Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Но естественно так не сработает, потому что вместо ostatok_na_date(:d1) должна быть таблица, а не вызов процедуры Но и сохранять в таблицу результат ostatok_na_date(:d1) я не могу - так как она вызывается очень часто в реальном времени и результат максимально быстро должен парситься и выводиться на экран Подскажите пожалуйста, как мне решить эту проблему наилучшим образом? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2020, 10:04 |
|
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
|
|||
---|---|---|---|
#18+
арт2010, subtract это Код: sql 1.
ты же не дал выражению алиас, чтобы оно нормально называлось. А запрос полный бред, как первый так и второй. Лучше никогда не вызывать селективную процедуру с побочными эффектами (обновление/удаление/вставка данных) в select с каким нибудь join, ибо пути оптимизатора неисповедимы и не известно сколько раз она может быть вызвана. Для устранения multiple rows in singleton select используй for select .... into ... do suspend; ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2020, 10:18 |
|
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
|
|||
---|---|---|---|
#18+
Симонов Денис, Спасибо за ответ! Но как мне лучше всего решить проблему, чтобы добиться максимальной скорости? Неужели кроме переписывания кода изначальной процедуры нет других приемлемых решений? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2020, 10:24 |
|
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
|
|||
---|---|---|---|
#18+
[quot арт2010#22183919] Ошибка - multiple rows in singleton select При этом в обычном запросе в Ibexpert все нормально отрабатывает, только неожиданно появляется какой-то столбец subtract, заполненный Null, но это ладно Почему в хранимке этот же код не работает? [/src] Одна из причин - в Эксперте не включена настройка "Фетчить всё". ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2020, 13:15 |
|
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
|
|||
---|---|---|---|
#18+
арт2010, Чтобы select возвращал только одну запись, можно использовать Код: plsql 1.
А лучше нанять программиста (ИМХО). Удачи ! ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2020, 13:26 |
|
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
|
|||
---|---|---|---|
#18+
арт2010, авторнеожиданно появляется какой-то столбец subtract, заполненный Null Код: plsql 1.
и можете использовать coalesce от неожиданных Null-ов. Удачи ! ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2020, 13:29 |
|
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
|
|||
---|---|---|---|
#18+
AltHasp, спасибо конечно, но ваши советы запоздали, поскольку Денис Симонов уже ответил на все вопросы. И да, речь про выбор одной записи вообще не шла. Выбрать надо как раз таки все записи, с этим проблем уже нет Проблема - как это сделать правильно и максимально быстро - по настоящему, по программистски! Решение со второй процедурой и for ... select - не совсем правильное и явно не самое быстрое. Денис Симонов же написал - лучше никогда не вызывать селективную процедуру с побочными эффектами (обновление/удаление/вставка данных) select с каким нибудь join, ибо пути оптимизатора неисповедимы и не известно сколько раз она может быть вызвана. Вот и нужно какое-то настоящее программистское решение, которое похоже сводится к одному - модифицировать текст исходной процедуры ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2020, 13:46 |
|
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
|
|||
---|---|---|---|
#18+
арт2010, Мы у нас если нужно выбрать несколько записей с помощью Select - то стандартно используем ХП (for select). Правда еще можно как курсор объявить чуток по-шустрее. "Ускорение" - понятие растяжимое тут от многого зависит и от аппаратной части и какая версия сервера, и от правильного использования индексов. Еще можно создать представления с нужными вам условиями. Если данные огромные, то у нас фоновый процесс "раскладывает по нужным полкам" и тогда отчеты "летают". Но у нас база терабайтная... Вообщем нет универсального совета и "секретной кнопки" ускоряющий все select-ы разом. А что такого сложного редактировать текст вашего ХП? Удачи ! ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2020, 14:19 |
|
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
|
|||
---|---|---|---|
#18+
18.08.2020 14:19, AltHasp пишет: > если нужно выбрать несколько записей с помощью Select - то стандартно используем ХП (for select). зачем? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2020, 14:21 |
|
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
|
|||
---|---|---|---|
#18+
В продолжение темы - можно ли как-то на уровне процедуры отбросить строки ее результаты где значение какого-то поля = 0? Именно результата, а не входных данных, потому что процедура считает остатки на текущий момент путем суммирования прихода со знаком + и расхода со знаком минус Скажем я пробую так Код: sql 1. 2. 3. 4. 5. 6.
Получаю Feature not supported (Firebird 2.5) Или что-то типа case when (OSTATOK <> 0) только к результату? Или же это ничего не даст в плане быстроты выполнения запроса, так все равно будут суммироваться все приходы и расходы и отсеивание строк с нулевым остатков уже на фигагльной стадии процедуры ничего не даст? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.08.2020, 17:31 |
|
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
|
|||
---|---|---|---|
#18+
арт2010, continue появился в 3.0 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.08.2020, 17:40 |
|
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
|
|||
---|---|---|---|
#18+
Либо придется идти по пути таблицы ежедневных остатков ... |
|||
:
Нравится:
Не нравится:
|
|||
25.08.2020, 17:42 |
|
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
|
|||
---|---|---|---|
#18+
арт2010 Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.08.2020, 17:52 |
|
В запросе нормально, в процедуре - multiple rows in singleton select или update результат?
|
|||
---|---|---|---|
#18+
hvlad, благодарю, теперь в самом приложении (Delphi) выполняется вроде быстрее, хотя Perfomance Analisys в Ibexpert утверждает, что время выполнения примерно одинаковое ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2020, 10:06 |
|
|
start [/forum/topic.php?fid=40&fpage=12&tid=1560269]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
51ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 171ms |
0 / 0 |