Impossible - you cannot issue DDL, as in a level trigger.
[possible commentary on the release of the project, edited as indicated]
Have you considered parallelizing your script? Instead of sweeping, relying on the removal of the cascade, use DBMS_SCHEDULER instead to parallelize the job. You can safely run parallel hits on tables at the same level of the dependency tree.
begin dbms_scheduler.create_program (program_name => 'snapshot_purge_cases', program_type => 'PLSQL_BLOCK', program_action => 'BEGIN delete from purge$Case; insert into purge$Case select CaseId from Case where deleteFlag = 1; delete from purge$Opt; insert into purge$Opt select OptId from OptimizationRun where CaseId in (select CaseId from purge$Case); delete from purge$Step; insert into purge$Step select StepId from OptimizationStep where OptId in (select OptId from purge$Opt); commit; END;', enabled => true, comments => 'Program to snapshot keys for purging'; ); dbms_scheduler.create_program (program_name => 'purge_case', program_type => 'PLSQL_BLOCK', program_action => 'BEGIN loop delete from Case where CaseId in (select Case from purge$Case) where rownum <= 50000; exit when sql%rowcount = 0; commit; end loop; commit; END;', enabled => true, comments => 'Program to purge the Case Table' ); -- repeat for each table being purged end; /
Only program settings. Now we need to create a chain of tasks so that we can put them together.
BEGIN dbms_scheduler.create_chain (chain_name => 'purge_case_chain'); END; /
Now we take steps in the task chain using programs from:
BEGIN dbms_scheduler.define_chain_step (chain_name => 'purge_case_chain', step_name => 'step_snapshot_purge_cases', program_name => 'snapshot_purge_cases' ); dbms_scheduler.define_chain_step (chain_name => 'purge_case_chain', step_name => 'step_purge_cases', program_name => 'purge_case' ); -- repeat for every table END; /
Now we need to link the chain steps together. Works will be inflated, for example:
- Remove
CaseIds , OptIds and StepIds to clear. - Clear all
OptimizationStep. dependent tables OptimizationStep. - Clear all
OptimizationRun. dependent tables OptimizationRun. - Clear all
Case. specific tables Case. - Cleaning
Case.
So then the code will look like this:
begin dbms_scheduler.define_chain_rule (chain_name => 'purge_case_chain', condition => 'TRUE', action => 'START step_snapshot_purge_cases', rule_name => 'rule_snapshot_purge_cases' ); -- repeat for every table dependent on OptimizationStep dbms_scheduler.define_chain_rule (chain_name => 'purge_case_chain', condition => 'step_snapshot_purge_cases COMPLETED', action => 'START step_purge_TwoDDataY2', rule_name => 'rule_purge_TwoDDataY2' ); -- repeat for every table dependent on OptimizationRun dbms_scheduler.define_chain_rule (chain_name => 'purge_case_chain', condition => 'step_purge_TwoDDataY2 COMPLETED and step_purge_ThreeDDataZ COMPLETED and ... ', action => 'START step_purge_OnedDataX', rule_name => 'rule_purge_OnedDataX' ); -- repeat for every table dependent on Case dbms_scheduler.define_chain_rule (chain_name => 'purge_case_chain', condition => 'step_purge_OneDDataX COMPLETED and step_purge_TwoDDataY1 COMPLETED and ... ', action => 'START step_purge_Files', rule_name => 'rule_purge_Files' ); dbms_scheduler.define_chain_rule (chain_name => 'purge_case_chain', condition => 'step_purge_Files COMPLETED and step_purge_OptimizationRun COMPLETED and ... ', action => 'START step_purge_Case', rule_name => 'rule_purge_Case' ); -- add a rule to end the chain dbms_scheduler.define_chain_rule (chain_name => 'purge_case_chain', condition => 'step_purge_Case COMPLETED', action => 'END', rule_name => 'rule_purge_Case' ); end; /
Enable task chain:
BEGIN DBMS_SCHEDULER.enable ('purge_case_chain'); END; /
You can start the chain manually:
BEGIN DBMS_SCHEDULER.RUN_CHAIN (chain_name => 'chain_purge_case', job_name => 'chain_purge_case_run' ); END; /
Or create a task to schedule it:
BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name => 'job_purge_case', job_type => 'CHAIN', job_action => 'chain_purge_case', repeat_interval => 'freq=daily', start_date => ... end_date => ... enabled => TRUE); END; /