Возможно, вы сможете использовать расширенный оператор DELETE
в 10g, который включает в себя ведение журнала ошибок.
Сначала используйте DBMS_ERRLOG
для создания таблицы журналов (которая является просто копией исходной таблицы с некоторыми дополнительными столбцами префиксов: ORA_ERR_MESG$, ..., ORA_ERR_TAG$
)
execute dbms_errlog.create_error_log('parent', 'parent_errlog');
Теперь вы можете использовать предложение LOG ERRORS оператора delete для захвата всех строк, которые имеют существующие ограничения целостности:
delete from parent
log errors into parent_errlog ('holding-breath')
reject limit unlimited;
В этом случае комментарий «задержка дыхания» будет помещен в столбец ORA_ERR_TAG$
.
Вы можете прочитать полную документацию здесь .
Если родительская таблица огромна, и вы хотите удалить только несколько случайных строк, в итоге вы получите таблицу parent_errlog
, которая, по сути, является дубликатом вашей parent
таблицы. Если это не так, вам придется проделать долгий путь:
- Прямая ссылка на дочерние таблицы (в соответствии с решением Тони ) или
- Перебрать таблицу в PL / SQL и перехватить любые исключения (следуя Путанице и Бобу ).