Deux approches possibles.
-
Si vous avez une clé étrangère, déclarez-la comme on-delete-cascade et supprimez les lignes parentes de plus de 30 jours. Toutes les lignes enfants seront supprimées automatiquement.
-
D'après votre description, il semble que vous connaissiez les lignes parentes que vous souhaitez supprimer et que vous deviez supprimer les lignes enfants correspondantes. Avez-vous essayé SQL comme ça ?
delete from child_table where parent_id in ( select parent_id from parent_table where updd_tms != (sysdate-30)
-- supprimer maintenant les enregistrements de la table parent
delete from parent_table where updd_tms != (sysdate-30);
---- En fonction de vos besoins, il semble que vous deviez utiliser PL/SQL. Je vais voir si quelqu'un peut poster une solution SQL pure à cela (auquel cas ce serait certainement la voie à suivre).
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;
/