# Vider automatiquement la corbeille RECYCLE_BIN Le script SQL suivant active la corbeille de tables supprimées (RECYCLE\_BIN), et crée respectivement : \- une table de log des vidages de la corbeille \- une procédure qui purge la corbeille avec une rétention définie \- un programme qui lance la procédure avec la rétention en argument \- un job qui lance le programme selon une fréquence définie ```SQL -- Tips : how to disable RECYCLEBIN, delete JOB and PROGRAM -- Execute this script as SYSTEM -- Note : need to close and restart session -- ALTER SYSTEM SET recyclebin = OFF DEFERRED; -- BEGIN --     DBMS_SCHEDULER.DISABLE ('PERIODIC_PURGE_RECYCLE_BIN_JOB'); -- END; -- / -- BEGIN --   DBMS_SCHEDULER.drop_job (job_name => 'PERIODIC_PURGE_RECYCLE_BIN_JOB'); -- END; -- / -- BEGIN --     DBMS_SCHEDULER.DISABLE ('PERIODIC_PURGE_RECYCLE_BIN'); -- END; -- / -- BEGIN --   DBMS_SCHEDULER.drop_program (program_name => 'PERIODIC_PURGE_RECYCLE_BIN'); -- END; -- / -- Enable recycle bin ALTER SYSTEM SET recyclebin = ON DEFERRED; -- Create JOB_LOG table if not exists DECLARE    table_exist number; BEGIN    select count(table_name) into table_exist from dba_tables    where table_name='JOB_LOG';    IF table_exist = 0 THEN       EXECUTE IMMEDIATE 'CREATE TABLE SYSTEM.job_log (         ts TIMESTAMP DEFAULT SYSTIMESTAMP,         message VARCHAR2(255))';    END IF; END; / -- For verification -- SELECT OWNER, TABLE_NAME FROM DBA_TABLES WHERE TABLE_NAME = 'JOB_LOG'; -- Create procedure PURGE_RECYCLE_BIN CREATE OR REPLACE PROCEDURE SYSTEM.PURGE_RECYCLE_BIN (v_nbjours IN INT) AUTHID CURRENT_USER AS  TYPE cur_typ IS REF CURSOR;  c cur_typ;  v_cur_sql VARCHAR(200);  v_owner VARCHAR(200);  v_oname VARCHAR(200);  v_sql VARCHAR(200); BEGIN   v_cur_sql := 'SELECT owner, original_name FROM sys.dba_recyclebin WHERE droptime < to_char(sysdate-'||v_nbjours||',''YYYY-MM-DD:HH24:MI:SS'') AND type=''TABLE''';   OPEN c FOR v_cur_sql;   LOOP     FETCH c INTO v_owner, v_oname;     EXIT WHEN c%NOTFOUND;     v_sql := 'PURGE TABLE '||v_owner||'.'||v_oname;     EXECUTE IMMEDIATE v_sql; --    for debugging: --    dbms_output.put_line('Table '||v_oname||' purged from RECYCLEBIN.');     INSERT INTO job_log(message) VALUES ('Table '||v_oname||' purged from RECYCLEBIN.');   END LOOP;   CLOSE c; END; / -- For verification -- SELECT OWNER,PROCEDURE_NAME FROM DBA_PROCEDURES WHERE PROCEDURE_NAME LIKE '%RECYCLE%'; -- Create program+argument (default : v_nbjours=180) BEGIN     DBMS_SCHEDULER.CREATE_PROGRAM(         PROGRAM_NAME => 'PERIODIC_PURGE_RECYCLE_BIN',         PROGRAM_TYPE => 'STORED_PROCEDURE',         PROGRAM_ACTION => 'SYSTEM.PURGE_RECYCLE_BIN',         NUMBER_OF_ARGUMENTS => 1,         ENABLED =>  FALSE,         COMMENTS => 'PERIODIC_PURGE_RECYCLE_BIN'     ); END; / BEGIN     DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT(         PROGRAM_NAME => 'PERIODIC_PURGE_RECYCLE_BIN',         argument_name     => 'V_NBJOURS',         argument_position => 1,         argument_type     => 'INT',         default_value     => '180'     ); END; / BEGIN     DBMS_SCHEDULER.ENABLE ('PERIODIC_PURGE_RECYCLE_BIN'); END; / -- For verification -- SELECT PROGRAM_NAME,ENABLED FROM DBA_SCHEDULER_PROGRAMS WHERE PROGRAM_NAME LIKE '%RECYCLE%'; -- Schedule and activate job with program BEGIN     DBMS_SCHEDULER.CREATE_JOB (         job_name        => 'PERIODIC_PURGE_RECYCLE_BIN_JOB',         start_date      =>  to_date('01/10/20 23:00:00', 'DD/MM/YY HH24:MI:SS'),         end_date        => NULL,         repeat_interval =>  'FREQ=DAILY',         PROGRAM_NAME    => 'PERIODIC_PURGE_RECYCLE_BIN',         ENABLED         => FALSE,         COMMENTS        => 'PERIODIC_PURGE_RECYCLE_BIN_JOB'     ); END; / BEGIN     DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE (         job_name => 'PERIODIC_PURGE_RECYCLE_BIN_JOB',         argument_name => 'V_NBJOURS',         argument_value => 1     ); END; / BEGIN     DBMS_SCHEDULER.ENABLE ('PERIODIC_PURGE_RECYCLE_BIN_JOB'); END; / -- For verification -- SELECT JOB_NAME,PROGRAM_NAME,NUMBER_OF_ARGUMENTS,NEXT_RUN_DATE,ENABLED FROM DBA_SCHEDULER_JOBS WHERE JOB_NAME LIKE '%RECYCLE%'; EXIT ```