Twee mogelijke benaderingen.
-
Als u een externe sleutel heeft, declareert u deze als on-delete-cascade en verwijdert u de bovenliggende rijen die ouder zijn dan 30 dagen. Alle onderliggende rijen worden automatisch verwijderd.
-
Op basis van uw beschrijving lijkt het erop dat u de bovenliggende rijen kent die u wilt verwijderen en dat u de bijbehorende onderliggende rijen moet verwijderen. Heb je SQL op deze manier geprobeerd?
delete from child_table where parent_id in ( select parent_id from parent_table where updd_tms != (sysdate-30)
-- verwijder nu de bovenliggende tabelrecords
delete from parent_table where updd_tms != (sysdate-30);
---- Op basis van uw vereisten lijkt het erop dat u PL/SQL moet gebruiken. Ik zal kijken of iemand hier een pure SQL-oplossing voor kan posten (in dat geval zou dat zeker de beste keuze zijn).
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;
/