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