Duas abordagens possíveis.
-
Se você tiver uma chave estrangeira, declare-a como on-delete-cascade e exclua as linhas pai com mais de 30 dias. Todas as linhas filhas serão excluídas automaticamente.
-
Com base na sua descrição, parece que você conhece as linhas pai que deseja excluir e precisa excluir as linhas filhas correspondentes. Você já tentou SQL assim?
delete from child_table where parent_id in ( select parent_id from parent_table where updd_tms != (sysdate-30)
-- agora exclui os registros da tabela pai
delete from parent_table where updd_tms != (sysdate-30);
---- Com base em seus requisitos, parece que você pode precisar usar PL/SQL. Vou ver se alguém pode postar uma solução SQL pura para isso (nesse caso, esse seria definitivamente o caminho a seguir).
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;
/