Oracle - игнорирование ошибок ограничений - PullRequest
3 голосов
/ 08 декабря 2011

У меня есть таблица персонала со многими строками, и я хотел бы удалить неиспользуемые строки из этой таблицы (все сотрудники, на которые никогда не ссылались никакие другие таблицы).

Существуют ограничения, такие, что невозможно удалить строки из таблицы персонала, если на них есть ссылки в другом месте. Из-за этого я надеялся, что смогу просто DELETE FROM STAFF, чтобы удалить строки без ссылок и оставить остальные.

К сожалению, Oracle считает это ошибкой, поэтому, как только он встречает строку, на которую ссылаются извне, весь запрос завершается с нарушением ограничения.

Есть ли способ, как я могу сказать Oracle просто игнорировать нарушение ограничения, оставить запись как есть и перейти к следующей?

Ответы [ 2 ]

3 голосов
/ 08 декабря 2011

Вы можете использовать протоколирование ошибок DML:

exec dbms_errlog.create_error_log(dml_table_name => 'STAFF'
    ,err_log_table_name => 'STAFF_ERRORS');

delete from STAFF
log errors into STAFF_ERRORS('Is referenced') reject limit 999999999;

Затем, при желании, удалить, усечь или удалить таблицу STAFF_ERRORS.

1 голос
/ 08 декабря 2011

Вы можете использовать PLSQL:

BEGIN
  FOR r IN (SELECT id FROM STAFF) LOOP
    begin
       delete STAFF where id = r.id;
    exception
       when others then
          null;
    end;
  END LOOP;
END;

Но для завершения может потребоваться некоторое время ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...