Dwa możliwe podejścia.
-
Jeśli masz klucz obcy, zadeklaruj go jako kaskadowo usuwany i usuń wiersze nadrzędne starsze niż 30 dni. Wszystkie wiersze podrzędne zostaną automatycznie usunięte.
-
Na podstawie Twojego opisu wygląda na to, że znasz wiersze nadrzędne, które chcesz usunąć, i musisz usunąć odpowiadające im wiersze podrzędne. Czy wypróbowałeś SQL w ten sposób?
delete from child_table where parent_id in ( select parent_id from parent_table where updd_tms != (sysdate-30)
-- teraz usuń rekordy tabeli nadrzędnej
delete from parent_table where updd_tms != (sysdate-30);
---- W oparciu o twoje wymagania, wygląda na to, że będziesz musiał użyć PL/SQL. Zobaczę, czy ktoś może opublikować na to rozwiązanie w postaci czystego SQL (w takim przypadku zdecydowanie byłoby to do zrobienia).
declare
v_sqlcode number;
PRAGMA EXCEPTION_INIT(foreign_key_violated, -02291);
begin
for v_rec in (select parent_id, child id from child_table
where updd_tms != (sysdate-30) ) loop
-- delete the children
delete from child_table where child_id = v_rec.child_id;
-- delete the parent. If we get foreign key violation,
-- stop this step and continue the loop
begin
delete from parent_table
where parent_id = v_rec.parent_id;
exception
when foreign_key_violated
then null;
end;
end loop;
end;
/