|
При наличии "SUSPEND" в "SELECT FOR" цикле оператор "UPDATE or INSERT" не вставляет
|
|||
---|---|---|---|
#18+
Есть такой запрос: Код: plsql 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.
Выполняем его в IBExpert. Если убрать "SUSPEND" - выполняется нормально: План PLAN (FB_USR INDEX (FB_USR_IDX1)) PLAN (AU NATURAL) 932 записей было обновлено в таблице FB_USR 570 записей было добавлено в таблицу FB_USR Если оставить "SUSPEND" до или после - выполняется только UPDATE PLAN (FB_USR INDEX (FB_USR_IDX1)) PLAN (AU NATURAL) 159 записей было обновлено в таблице FB_USR А вот если вставить "SUSPEND" в такой запрос: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
то получим План PLAN (FB_USR INDEX (FB_USR_IDX1)) PLAN (AU NATURAL) 1 записей было обновлено в таблице FB_USR Без "SUSPEND" работает нормально. Firebird 2.5.9.27139 (релиз) superserver Windows 7 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2019, 10:04 |
|
При наличии "SUSPEND" в "SELECT FOR" цикле оператор "UPDATE or INSERT" не вставляет
|
|||
---|---|---|---|
#18+
dedRasta, для начала надо изучить как работает suspend и больше никогда не делать таких глупостей. Самое важное твой чудесный блок изменит столько записей сколько будет отфетчено на клиента. Плюс не забыть что suspend вызывает разрыв savepoint и стабильность курсора может быть нарушена ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2019, 10:22 |
|
При наличии "SUSPEND" в "SELECT FOR" цикле оператор "UPDATE or INSERT" не вставляет
|
|||
---|---|---|---|
#18+
dedRasta, а почитать про suspend в руководстве не судьба? Написано - suspend приостанавливает выполнение всего до тех пор пока не обработаете выходные значения. В случае Execute Block это на стороне клиента. Подозреваю, что и Эксперт не поможет. Я бы заменил Execute block на хранимку. Для отладки хотя бы. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2019, 10:26 |
|
При наличии "SUSPEND" в "SELECT FOR" цикле оператор "UPDATE or INSERT" не вставляет
|
|||
---|---|---|---|
#18+
dedRasta, fetch all ? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2019, 11:25 |
|
При наличии "SUSPEND" в "SELECT FOR" цикле оператор "UPDATE or INSERT" не вставляет
|
|||
---|---|---|---|
#18+
KreatorXXIВ случае Execute Block это на стороне клиента.Что - это ??? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2019, 11:26 |
|
При наличии "SUSPEND" в "SELECT FOR" цикле оператор "UPDATE or INSERT" не вставляет
|
|||
---|---|---|---|
#18+
hvladKreatorXXIВ случае Execute Block это на стороне клиента.Что - это ??? Прочитал блок "Входные и выходные параметры" для оператора Execute Block. Может чего не понял или понял не так. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2019, 12:05 |
|
При наличии "SUSPEND" в "SELECT FOR" цикле оператор "UPDATE or INSERT" не вставляет
|
|||
---|---|---|---|
#18+
dedRasta, вместо SUSPEND заталкивай во временную таблицу, а после выталкивай оттуда. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2019, 13:19 |
|
При наличии "SUSPEND" в "SELECT FOR" цикле оператор "UPDATE or INSERT" не вставляет
|
|||
---|---|---|---|
#18+
rdb_dev, dedRasta можно как-то так Код: 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. 32.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2019, 13:26 |
|
При наличии "SUSPEND" в "SELECT FOR" цикле оператор "UPDATE or INSERT" не вставляет
|
|||
---|---|---|---|
#18+
Симонов ДенисСамое важное твой чудесный блок изменит столько записей сколько будет отфетчено на клиента. Возможно, это и хорошо. Если в постановке задаче будет важнее показать на клиенте, что реально было изменено, и ничего не пропустить, чем изменить все данные, но показать не все изменения. Симонов Денис Код: sql 1. 2. 3. 4. 5. 6. 7.
Бррр. Понимаю, что на скорую руку. Но всё же лучше от цикла избавиться вообще. Сначала заполняем GTT одной командой insert, потом модифицируем таблицу одной командой MERGE. Заодно можно будет, если надо, избавиться от холостых update'ов ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2019, 14:31 |
|
При наличии "SUSPEND" в "SELECT FOR" цикле оператор "UPDATE or INSERT" не вставляет
|
|||
---|---|---|---|
#18+
Симонов Денисrdb_dev, dedRasta можно как-то такДа, норм! Только внутри begin...end я бы сделал так: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
Чтобы потом долго и упорно не искать концы на случай внесения изменения триггерами таблицы "fb_user", которые могут уже существовать или появятся в будущем. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2019, 20:25 |
|
При наличии "SUSPEND" в "SELECT FOR" цикле оператор "UPDATE or INSERT" не вставляет
|
|||
---|---|---|---|
#18+
Всем большое спасибо! Буду изучать. hvlad, не понял насчет fetch all. Это где можно выставить? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2019, 21:03 |
|
При наличии "SUSPEND" в "SELECT FOR" цикле оператор "UPDATE or INSERT" не вставляет
|
|||
---|---|---|---|
#18+
dedRastahvlad, не понял насчет fetch all. Это где можно выставить?Это на клавиатуре\тулбаре ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2019, 22:41 |
|
При наличии "SUSPEND" в "SELECT FOR" цикле оператор "UPDATE or INSERT" не вставляет
|
|||
---|---|---|---|
#18+
hvladdedRastahvlad, не понял насчет fetch all. Это где можно выставить?Это на клавиатуре\тулбаре Не, пора на пенсию. Всегда маячила перед глазами эта кнопка и в голову не приходило просто мышкой на нее показать. А с ее помощью первый вариант с SUSPEND отрабатывает без проблем: План PLAN (FB_USR INDEX (FB_USR_IDX1)) PLAN (AU NATURAL) 932 записей было обновлено в таблице FB_USR 570 записей было добавлено в таблицу FB_USR Но идея с GTT тоже пригодится - для отчетов о результатах импорта/экспорта. Еще раз всем спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2019, 09:50 |
|
При наличии "SUSPEND" в "SELECT FOR" цикле оператор "UPDATE or INSERT" не вставляет
|
|||
---|---|---|---|
#18+
dedRasta, можно ещё в настройках IBE сделать, чтобы всегда был fetch all, но это на любителя, на больших запросах... сам понимаешь. ----------- кстати о "сумасшедших идеях" и об уходе от императивного стиля назад к декларативному. исходный код Расты-Симонова - это два цикла FOR SELECT, с итерацией по одной строчке мой вариант - INSERT+MERGE, но потом снова цикл, иначе данные из selectable SP/EB не вытолкнешь а что, если бы на VIEW/GTT можно было бы сделать триггер BEFORE SELECT, который бы её и заполнял по необходимости ? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2019, 11:41 |
|
При наличии "SUSPEND" в "SELECT FOR" цикле оператор "UPDATE or INSERT" не вставляет
|
|||
---|---|---|---|
#18+
Arioch, триггер не нужен, но VIEW может быть создана на основе ХП. При некоторых условиях можно и вообще без GTT обойтись MERGE + Код: sql 1. 2. 3. 4. 5.
1. блок должен выполняться в транзакции только один раз, новое выполнение требует новую транзакцию 2. выборка из FB_USR будет использовать NATURAL 3. требуется Firebird 3.0 и выше ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2019, 12:10 |
|
При наличии "SUSPEND" в "SELECT FOR" цикле оператор "UPDATE or INSERT" не вставляет
|
|||
---|---|---|---|
#18+
Симонов Денистриггер не нужен, но VIEW может быть создана на основе ХП. VIEW = SELECT FROM SP: а как с материализацией? создавать постоянную таблицу и проверяйт её в процедуре? оптимизатору не понравится на join'ах и громоздко раздельно SP и таблицу - надо будет две инструкции всегда выполнять, leaking implementation details ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2019, 17:27 |
|
|
start [/forum/topic.php?fid=40&fpage=21&tid=1560604]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
others: | 268ms |
total: | 394ms |
0 / 0 |