|
Почему несколько insert'ов в одном скрипте не всегда отрабатывают? и что сделать чтобы отрабатывали?
|
|||
---|---|---|---|
#18+
В Delphi генерю текст скрипта, заталкиваю в запрос, в скрипте куча инсертов, (>100) инсертов в одном скрипте, типа: Код: SQL 1. 2. 3. 4. 5. 6. 7.
Читал что при ошибке в одном из инсертов остальные могут не отработать. Возможно такая ситуация возникает иногда, но маловероятно, ошибок не выдает. Ошибок вроде нету, но на всякий случай посмотрел что будет если вдруг ошибка все-таки... намеренно сделал ошибку в одном из инсертов, получил ситуацию такую: пишет, что ошибка в такой-то строке; далее пишет, что игнорирует эту строку и продолжает вставку... Хотя мне желательно чтобы 1) вставил все и 2)при наличии ошибки откатить назад то, что вставлено и прервать исполнение скрипта. PS. Вся эта возня со скриптами была задумана для ускорения работы с базой... хотел как лучше, а получилось как всегда ![]() ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2025, 18:05 |
|
Почему несколько insert'ов в одном скрипте не всегда отрабатывают? и что сделать чтобы отрабатывали?
|
|||
---|---|---|---|
#18+
qwerty321 [игнорируется]
Код: SQL 1. 2. 3. 4. 5. 6. 7.
Код: 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. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50.
Если рассматривать задачу "в вакууме", когда нужно вставить "большое" кол-во строк в БД, то часто такая задача упирается в используемый клиентский компонент. С точки зрения СУБД Oracle Database, решения от Bulk Binding (описание для PL/SQL, но аналогичное и поддерживается многими клиентскими компонентами) до Direct Path Load: Цитата [игнорируется] The following direct-path INSERT methods: Direct path SQL*Loader CREATE TABLE AS SELECT statements Parallel INSERT statements INSERT statements with an APPEND or APPEND_VALUES hint Выбор конкретного метода определяется конкретной задачей. Что конкретно происходит в текущем случае, проще смотреть через трассировку sql_trace + 10051 level 1 (OPI), т.к. могут быть различные auto-commit и прочее. Для простого решения можно остановиться на bulk binding и обрабатывать ошибки так, как требуется (откат всего при ошибке или фиксация только тех строк, что вставлены успешно, и т.д.). Литералы не использовать по многим причинам, в том числе, производительность, безопасность данных и SQL injection. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2025, 13:47 |
|
Почему несколько insert'ов в одном скрипте не всегда отрабатывают? и что сделать чтобы отрабатывали?
|
|||
---|---|---|---|
#18+
DMaslov [игнорируется] SeaGate [игнорируется] Спасибо, я знал что это форум друзей. Oracle использует Statement-Level Atomicity, поэтому, такая ситуация в нём невозможна, что демонстрирует пример ниже. The unsuccessful statement does not cause the loss of any work that preceded it in the current transaction. В общем так я и не разобрался, встретилась эта ситуация 1 раз у пользователей, что они там делали понять невозможно. Чтобы не повторилась такая ситуация сделал просто в цикле загрузку, по одному инсерту за раз, чтобы исключения перехватывать нормально, откаты чтобы можно было сделать, один коммит после всей загрузки (или откат если неудача). ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2025, 20:24 |
|
|
start [/forum/topic.php?fid=52&gotolast=1&tid=2187288]: |
0ms |
get settings: |
11ms |
get forum list: |
17ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
36ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
others: | 271ms |
total: | 414ms |
0 / 0 |