powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Почему несколько insert'ов в одном скрипте не всегда отрабатывают? и что сделать чтобы отрабатывали?
4 сообщений из 4, страница 1 из 1
Почему несколько insert'ов в одном скрипте не всегда отрабатывают? и что сделать чтобы отрабатывали?
    #40141332
qwerty321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Delphi генерю текст скрипта, заталкиваю в запрос, в скрипте куча инсертов, (>100) инсертов в одном скрипте, типа:
Код: SQL
1.
2.
3.
4.
5.
6.
7.
begin
  insert into table_1 (flt_field_1, txt_field_2) values (1, 'txt_1');
  insert into table_1 (flt_field_1, txt_field_2) values (2, 'txt_2');
  insert into table_1 (flt_field_1, txt_field_2) values (3, 'txt_3');
  insert into table_1 (flt_field_1, txt_field_2) values (4, 'txt_4');
  insert into table_1 (flt_field_1, txt_field_2) values (5, 'txt_5');
end;
Иногда этот скрипт не всегда отрабатывает, т.е. не все записи вставляет, не могу понять почему. Ошибок в данных вроде бы нету.
Читал что при ошибке в одном из инсертов остальные могут не отработать. Возможно такая ситуация возникает иногда, но маловероятно, ошибок не выдает.

Ошибок вроде нету, но на всякий случай посмотрел что будет если вдруг ошибка все-таки... намеренно сделал ошибку в одном из инсертов, получил ситуацию такую: пишет, что ошибка в такой-то строке; далее пишет, что игнорирует эту строку и продолжает вставку...
Хотя мне желательно чтобы 1) вставил все и 2)при наличии ошибки откатить назад то, что вставлено и прервать исполнение скрипта.

PS. Вся эта возня со скриптами была задумана для ускорения работы с базой... хотел как лучше, а получилось как всегда [:unsure]
...
Рейтинг: 0 / 0
Почему несколько insert'ов в одном скрипте не всегда отрабатывают? и что сделать чтобы отрабатывали?
    #40141334
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwerty321 [игнорируется] 
qwerty321  11.08.2025, 18:05
[игнорируется]
Код: SQL
1.
2.
3.
4.
5.
6.
7.
begin
  insert into table_1 (flt_field_1, txt_field_2) values (1, 'txt_1');
  insert into table_1 (flt_field_1, txt_field_2) values (2, 'txt_2');
  insert into table_1 (flt_field_1, txt_field_2) values (3, 'txt_3');
  insert into table_1 (flt_field_1, txt_field_2) values (4, 'txt_4');
  insert into table_1 (flt_field_1, txt_field_2) values (5, 'txt_5');
end;
Oracle использует Statement-Level Atomicity, поэтому, такая ситуация в нём невозможна, что демонстрирует пример ниже.
Код: 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.
SQL> conn / as sysdba
Connected.
SQL> alter session set container=pdb;

Session altered.

SQL> drop user tc cascade;

User dropped.

SQL>
SQL> grant create session, create table to tc identified by tc;

Grant succeeded.

SQL> alter user tc quota 100m on users;

User altered.

SQL>
SQL> conn tc/tc@myhostname/pdb
Connected.
SQL>
SQL> create table t(id int primary key);

Table created.

SQL>
SQL> select * from t;

no rows selected

SQL>
SQL> begin
  2    insert into t(id) values (1);
  3    insert into t(id) values (1);
  4    insert into t(id) values (2);
  5    insert into t(id) values (3);
  6  end;
  7  /
begin
*
ERROR at line 1:
ORA-00001: unique constraint (TC.SYS_C007923) violated
ORA-06512: at line 3

SQL>
SQL> select * from t;

no rows selected
Т.е. изначальное описание проблемы неверно (не та СУБД/не тот пример и т.д.).
Если рассматривать задачу "в вакууме", когда нужно вставить "большое" кол-во строк в БД, то часто такая задача упирается в используемый клиентский компонент. С точки зрения СУБД 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
Плюс exchange partition, вариации и комбинации предыдущих методов.
Выбор конкретного метода определяется конкретной задачей.

Что конкретно происходит в текущем случае, проще смотреть через трассировку sql_trace + 10051 level 1 (OPI), т.к. могут быть различные auto-commit и прочее. Для простого решения можно остановиться на bulk binding и обрабатывать ошибки так, как требуется (откат всего при ошибке или фиксация только тех строк, что вставлены успешно, и т.д.). Литералы не использовать по многим причинам, в том числе, производительность, безопасность данных и SQL injection.
...
Рейтинг: 0 / 0
Почему несколько insert'ов в одном скрипте не всегда отрабатывают? и что сделать чтобы отрабатывали?
    #40141343
DMaslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwerty321 [игнорируется] 
--- ошибка в такой-то строке; далее пишет, что игнорирует эту строку и продолжает вставку...

Собсно, вот и ответ на вопрос.

Использовать в приложении тот SQL-движок, работу которого вы можете контролировать: начало транзакции, ошибки, commit.
...
Рейтинг: 0 / 0
Почему несколько insert'ов в одном скрипте не всегда отрабатывают? и что сделать чтобы отрабатывали?
    #40141352
qwerty321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DMaslov [игнорируется] 

SeaGate [игнорируется] 

Спасибо, я знал что это форум друзей.
SeaGate  12.08.2025, 13:47
[игнорируется]
Oracle использует Statement-Level Atomicity, поэтому, такая ситуация в нём невозможна, что демонстрирует пример ниже.
По ссылке прошел, но там какие-то оговорки (мне не очень понятные)
The unsuccessful statement does not cause the loss of any work that preceded it in the current transaction.

В общем так я и не разобрался, встретилась эта ситуация 1 раз у пользователей, что они там делали понять невозможно.

Чтобы не повторилась такая ситуация сделал просто в цикле загрузку, по одному инсерту за раз, чтобы исключения перехватывать нормально, откаты чтобы можно было сделать, один коммит после всей загрузки (или откат если неудача).
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Почему несколько insert'ов в одном скрипте не всегда отрабатывают? и что сделать чтобы отрабатывали?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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