Два възможни подхода.
-
Ако имате външен ключ, декларирайте го като on-delete-cascade и изтрийте родителските редове, по-стари от 30 дни. Всички дъщерни редове ще бъдат изтрити автоматично.
-
Въз основа на вашето описание изглежда, че знаете родителските редове, които искате да изтриете, и трябва да изтриете съответните дъщерни редове. Опитвали ли сте SQL като този?
delete from child_table where parent_id in ( select parent_id from parent_table where updd_tms != (sysdate-30)
-- сега изтрийте записите на родителската таблица
delete from parent_table where updd_tms != (sysdate-30);
---- Въз основа на вашето изискване изглежда, че може да се наложи да използвате PL/SQL. Ще видя дали някой може да публикува чисто SQL решение за това (в този случай това определено ще бъде начинът).
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;
/