удалить, всё что можно

m_kus
Дата: 05.06.2006 13:38:12
Вот интересно стало. Надо удалить из справочника все записи, на которые нет ссылок. Сколько таблиц ссылается неизвестно (точнее известно только в user_contraints). Как проще? ;)
m_kus
Дата: 05.06.2006 13:41:06
m_kus
Вот интересно стало. Надо удалить из справочника все записи, на которые нет ссылок. Сколько таблиц ссылается неизвестно (точнее известно только в user_contraints). Как проще? ;)

Забыл пояснить. Хочу сделать процедуру обновления справочника. Загружаем справочник извне. Через MERGE. Желательно устаревшие записи грохнуть попроще. А если они устрели, но есть на них ссылки - оставить. В идеале можно название поправить на "старое название - УДАЛЕНО", но можно и просто оставить...
Vadim_Maximov
Дата: 05.06.2006 13:42:09
begin
  delete from master_table where ....
exception
  when others then
     if sqlcode = /* здесь вставить код ошибки child record found*/ then null;
end;
orawish
Дата: 05.06.2006 14:01:23
А я бы таки залез в констрейнты и сгенерировал дилит, где
id минус ref1_id минус ref2_id ..
Vadim_Maximov
Дата: 05.06.2006 14:04:07
Vadim_Maximov
begin
  delete from master_table where ....
exception
  when others then
     if sqlcode = /* здесь вставить код ошибки child record found*/ then null;
end;
Т.е. немного не так. Нужно сделать цикл по записям и удалять построчно в цикле. И обернуть удаление begin exception end;
m_kus
Дата: 06.06.2006 06:09:37
Vadim_Maximov
...Т.е. немного не так. Нужно сделать цикл по записям и удалять построчно в цикле. И обернуть удаление begin exception end;

Ну да, я догадался... А это будет не сильно медленно? Или всё-таки "залезть в констрейнты"? Хотя по идее, Оракл то всё равно проверит, самому проверять получается не надо...
orawish
Дата: 06.06.2006 09:11:16
m_kus
Vadim_Maximov
...Т.е. немного не так. Нужно сделать цикл по записям и удалять построчно в цикле. И обернуть удаление begin exception end;

Ну да, я догадался... А это будет не сильно медленно? Или всё-таки "залезть в констрейнты"? Хотя по идее, Оракл то всё равно проверит, самому проверять получается не надо...
Это же типичный вопрос 'а сколько орехов будет куча?'. Если всего строк в таблице <=тысячи-десятки тысяч - я бы выбрал цикл с попыткой построчного удаления. Больше - наверное, пора формировать один dml.
m_kus
Дата: 06.06.2006 09:20:50
orawish
Это же типичный вопрос 'а сколько орехов будет куча?'. Если всего строк в таблице <=тысячи-десятки тысяч - я бы выбрал цикл с попыткой построчного удаления. Больше - наверное, пора формировать один dml.

Спасибо, примерно такого ответа я и ожидал (ну сформулировал не лучшим образом).
Двоюшник
Дата: 06.06.2006 14:24:57
Vadim_Maximov
Vadim_Maximov
begin
  delete from master_table where ....
exception
  when others then
     if sqlcode = /* здесь вставить код ошибки child record found*/ then null;
end;
Т.е. немного не так. Нужно сделать цикл по записям и удалять построчно в цикле. И обернуть удаление begin exception end;

Вот смеху то будет, если в констрейнтах on delete cascade...
---
Ну ты заходи ежели чё...
Alexey Polovinkin
Дата: 06.06.2006 16:40:35