Задача. Решение. Повторная вставка без exception
Кратко: нужно выполнить повторно insert с таким же PK без возникновения ошибки. Постановка.
1️⃣ Переписать через merge
2️⃣ Использовать хинт (с Oracle 11g)
У хинта есть ограничения, он не всегда подходит. Смотрим документацию.
3️⃣ Использовать опцию log errors в DML
предварительно создаем таблицу для логирования ошибок
подробности в этом посте
4️⃣ Способ читерский (через PL/SQL)
С PL/SQL может быть полет фантазии, но интересовал, прежде всего, SQL.
В чатике коллеги накидали еще вариантов.
А что там в PostgreSQL?
Самое простое решение:
К осени, планирую запустить пилотный поток по основам СУБД PostgreSQL, миграции с Oracle. Кому интересно пишите в личку, ищу 9 человек 😉
————
Понравилась задачка? Ставь 👍
#решениезадачи #exception #dml
Канал Oracle Developer | Чатик 💬
Кратко: нужно выполнить повторно insert с таким же PK без возникновения ошибки. Постановка.
1️⃣ Переписать через merge
merge into tab1 d
using (select 1 id, 's1' val from dual) s
on (d.id = s.id)
when not matched then insert(id, val)
values(s.id, s.val);
2️⃣ Использовать хинт (с Oracle 11g)
insert /*+ ignore_row_on_dupkey_index(tab1(id)) */
into tab1 values (1, 's1');
У хинта есть ограничения, он не всегда подходит. Смотрим документацию.
3️⃣ Использовать опцию log errors в DML
предварительно создаем таблицу для логирования ошибок
call dbms_errlog.create_error_log(
dml_table_name => 'tab1',
err_log_table_name => 'tab1$errlog'
);
insert into tab1 values (1, 's1')
log errors into tab1$errlog reject limit unlimited;
подробности в этом посте
4️⃣ Способ читерский (через PL/SQL)
begin
insert into tab1 values (1, 's1');
exception
when DUP_VAL_ON_INDEX then
null;
end;
/
С PL/SQL может быть полет фантазии, но интересовал, прежде всего, SQL.
В чатике коллеги накидали еще вариантов.
А что там в PostgreSQL?
Самое простое решение:
insert into tab1 values (1, 's1')
on conflict on constraint tab1_pk
do nothing;
К осени, планирую запустить пилотный поток по основам СУБД PostgreSQL, миграции с Oracle. Кому интересно пишите в личку, ищу 9 человек 😉
————
Понравилась задачка? Ставь 👍
#решениезадачи #exception #dml
Канал Oracle Developer | Чатик 💬