Инструкция LOG ERRORS
Если DML-операция при массовой обработке данных вызывает ошибки при добавлении или изменении, какой либо записи, то вся операция DML будет отменена.
Инструкция LOG ERRORS, предназначена для обхода подобных ситуаций. Если в процессе выполнения DML операции возникает ошибка, то информация о ней запишется в заранее созданную (при помощи пакета DBMS_ERRLOG) таблицу логов, на которую указывает конструкция LOG ERRORS.
Таблица для логирования ошибок, создается через процедуру:
Есть определенные ограничения при использовании данного функционала.
Если интересно, могу запилить видос с демонстрацией функционала 🎥
#sql #dml #logerrors
Если DML-операция при массовой обработке данных вызывает ошибки при добавлении или изменении, какой либо записи, то вся операция DML будет отменена.
Инструкция LOG ERRORS, предназначена для обхода подобных ситуаций. Если в процессе выполнения DML операции возникает ошибка, то информация о ней запишется в заранее созданную (при помощи пакета DBMS_ERRLOG) таблицу логов, на которую указывает конструкция LOG ERRORS.
Таблица для логирования ошибок, создается через процедуру:
dbms_errlog.create_error_log(‘название_исходной_табл, ‘название_табл_ошибок’);Пример применения с INSERT:
insert into data_tabДанный функционал обычно применяется для поиска дублей, загрузки данных с логом ошибок и т.п.
select ...
from ….
log errors into error_log_data_tab reject limit unlimited;
Есть определенные ограничения при использовании данного функционала.
Если интересно, могу запилить видос с демонстрацией функционала 🎥
#sql #dml #logerrors
👍4
DML без прерывания выполнения при возникновении ошибок (log errors)
Всем привет!
Запилил новый видос, за который вы когда-то проголосовали.
В нем, я расскажу как выполнять DML-операции в которых могут возникнуть ошибки, при этом не прерывая выполнение всей операции.
Представьте вам нужно вставить 100 записей, 10 из них могут вызвать ошибку. При этом нужно, чтобы вставка остальных 90 записей прошла успешно. Для этого используется расширение команд DML => log errors.
Видео будет небольшое, но информативное.
Приятного просмотра!
🎥 Смотреть видео - 5 мин
#видео #dml #logerrors
Всем привет!
Запилил новый видос, за который вы когда-то проголосовали.
В нем, я расскажу как выполнять DML-операции в которых могут возникнуть ошибки, при этом не прерывая выполнение всей операции.
Представьте вам нужно вставить 100 записей, 10 из них могут вызвать ошибку. При этом нужно, чтобы вставка остальных 90 записей прошла успешно. Для этого используется расширение команд DML => log errors.
Видео будет небольшое, но информативное.
Приятного просмотра!
🎥 Смотреть видео - 5 мин
#видео #dml #logerrors
👍5
Задача. Решение. Повторная вставка без 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 | Чатик 💬
👍39