Verwendung von DBMS_REPAIR

Das Package DBMS_REPAIR kann zur Überprüfung von logischen Blockfehlern verwendet werden. Hier eine Prozedure zur Verwendung. Das unten angegebene Beispiel erzeugt eine Prozedur, die ein Schema als Übergabeparameter erwartet und die entsprechenden Tablellen überprüft. Das Ergebnis wird in eine Log-Datei geschrieben.


CREATE OR REPLACE PROCEDURE CHECK_TABLES(CHECK_SCHEMA VARCHAR2,LOG_DIRECTORY VARCHAR2:='DATA_PUMP_DIR')
IS
 CURSOR CHECK_CURSOR IS
 SELECT TABLE_NAME FROM DBA_TABLES
 WHERE OWNER=CHECK_SCHEMA AND IOT_TYPE IS NULL AND IOT_NAME IS NULL;
 CURRUPT_BLOCKS NUMBER(10);
 FILE_ID UTL_FILE.FILE_TYPE;
BEGIN
 
 IF UPPER(CHECK_SCHEMA)'SYS' THEN
  DBMS_OUTPUT.ENABLE(20000);
  DBMS_REPAIR.ADMIN_TABLES('REPAIR_TABLE',DBMS_REPAIR.REPAIR_TABLE, DBMS_REPAIR.CREATE_ACTION);
  FILE_ID := UTL_FILE.FOPEN(LOG_DIRECTORY,'BLOCK_CHECK_' || CHECK_SCHEMA || '.LOG','a');
  UTL_FILE.PUT_LINE(FILE_ID,'****************' || TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') || '****************');
  FOR REC_TABLES IN CHECK_CURSOR LOOP
   BEGIN
    DBMS_REPAIR.CHECK_OBJECT(CHECK_SCHEMA, REC_TABLES.TABLE_NAME, CORRUPT_COUNT=>CURRUPT_BLOCKS);
    UTL_FILE.PUT_LINE(FILE_ID, TO_CHAR(CURRUPT_BLOCKS) || ' CORRUPT BLOCKS IN TABLE ' || REC_TABLES.TABLE_NAME);
    DBMS_OUTPUT.PUT_LINE(TO_CHAR(CURRUPT_BLOCKS) || ' CORRUPT BLOCKS IN TABLE ' || REC_TABLES.TABLE_NAME);
   EXCEPTION
    WHEN OTHERS THEN
     UTL_FILE.PUT_LINE(FILE_ID,'ERROR WHILE CHECKING TABLE ' || REC_TABLES.TABLE_NAME || '=>' || SQLERRM);
   END;
  END LOOP;
  UTL_FILE.PUT_LINE(FILE_ID,'***************************************************');
  UTL_FILE.PUT_LINE(FILE_ID,'');
  UTL_FILE.FCLOSE(FILE_ID);
  DBMS_REPAIR.ADMIN_TABLES('REPAIR_TABLE',DBMS_REPAIR.REPAIR_TABLE,DBMS_REPAIR.DROP_ACTION);
 END IF;
END;