Мне нужно выполнить массовое удаление из нескольких таблиц. В этих таблицах включено ограничение ссылочной целостности. В случае, если я пропущу удаление какой-либо записи из дочерней таблицы, я смогу зафиксировать имя ограничения внешнего ключа, которое было нарушено.
Я могу захватить имя ограничения внешнего ключа, если я не использую SAVE EXCEPTIONS, однако, если я использую SAVE EXCEPTIONS, я не смогу захватить имя.
например, Комупродемонстрировать, что я создал 2 таблицы со ссылочной целостностью.
test_parent(id number,PARENT_NAME VARCHAR2)
test_child (id number,child_NAME VARCHAR2)
ссылка на столбец id из test_child на test_parent
Я вставил несколько записей в обе, а затем попытался удалить из test_parent, не удаляя из test_child
для репликации ошибки для демонстрации.
set serveroutput on <br>
declare <br>
cursor cp is select * from test_parent;<br>
type t_cp is table of cp%rowtype;<br>
tt_cp t_cp;<br>
begin<br>
select * bulk collect into tt_cp from test_parent;<br>
begin<br>
forall idx in 1..tt_cp.count save exceptions<br>
delete from TEST_PARENT where id=tt_cp(idx).id;<br>
exception<br>
when others then<br>
for i in 1..sql%bulk_exceptions.count<br>
loop<br>
dbms_output.put_line(sqlerrm(-1 * SQL%BULK_EXCEPTIONS(i).ERROR_CODE));<br>
end loop;<br>
end;<br>
exception<br>
when others then<br>
rollback;<br>
dbms_output.put_line(sqlerrm);<br>
rollback;<br>
end;<br>
/<br>
Как получить имя ограничения вместе с использованием SAVE EXCEPTIONS
?
[Ниже выводится, если я не использую SAVE EXCEPTIONS]
ORA-02292: ограничение целостности (SYSTEM.SYS_C0014790) нарушено - найдена дочерняя запись
[Ниже выводится, если я использую SAVE EXCEPTIONS]
ORA-02292: нарушено ограничение целостности (.) - найдена дочерняя запись ORA-02292: нарушено ограничение целостности (.) - найдена дочерняя запись