Oracle数据字典一致性鉴别

数据字典(dd)一致性鉴别

dd损坏通常包括:
1. Data Dictionary Inconsistency, missing rows in tables:
          - Tab$/Ind$ with no entries in OBJ$
          - Undo$/Tab$/Ind$ with no entries in SEG$
          - Seg$ with no entries in TAB$/IND$/OBJ$
tab$和ind$的条目在OBJ$中不存在;Undo$/Tab$/Ind$的条目在SEG$中不存在;Seg$的条目在TAB$/IND$/OBJ$中不存在
2. Missing data dictionary objects
DD对象丢失
3. Corrupted data dictionary objects (table, index, or table-index inconsistency)
DD对象损坏
4. Invalid entries in data dictionary tables.
DD表中存在无效对象

1. Identifying Objects with Data Dictionary Inconsistency
 
首先需要安装hcheck包,参见Note136697.1
In order to detect data dictionary inconsistency we need to run hcheck.full procedure, see Note 136697.1.

      a. Connect as SYS schema in sqlplus
      b. Create package hOut as described in Note 101468.1  先创建hOut包,该包主要用于控制hcheck系列程序的输出,见附件hout.sql
      c. Create package hcheck in SYS schema as described in Note 136697.1 attachment.
       d. set serveroutput on
      c. execute hcheck.full

The script will report various dictionary related issues that may or may not be a problem.
Any problems reported should be reviewed by an experienced support analyst as some
reported "problems" may be normal and expected.


Example of HCHECK.FULL output:

Problem: Orphaned IND$ (no SEG$) - See Note 65987.1 (Bug:624613/3655873)  
ORPHAN IND$: OBJ=200449 DOBJ=200449 TS=0 RFILE/BLOCK=0 0 BO#=200446 SegType=  
^- May be OK. Needs manual check
 ORPHAN IND$: OBJ=39442 DOBJ=39442 TS=14 RFILE/BLOCK=2 49 BO#=39438 SegType=  

Problem: Orphaned TAB$ (no SEG$)  
ORPHAN TAB$: OBJ=1817074 DOBJ=0 TS=0 RFILE/BLOCK=0 0 BOBJ#= SegType=  
^- May be OK. Needs manual check
 ORPHAN TAB$: OBJ=2149126 DOBJ=2149126 TS=19 RFILE/BLOCK=31 44291 BOBJ#= SegType=
 
Problem: Orphaned SEG$ Entry  
ORPHAN SEG$: SegType=INDEX TS=20 RFILE/BLOCK=33 28435
 
 
 
Based on the hcheck.full output you will have to identify the objects that show a dd inconsistency, and verify the reported inconsistency.
 

Select name,type# from obj$ where obj#=<OBJ>; /* 1=INDEX, 2=TABLE, 3=CLUSTER, 21=LOB, 25=IOT
Select object_name,owner,object_type from dba_objects where object_id=<OBJ>;

Some of the problems, mainly the one marked as  'May be OK. Needs manual check ' could be a false alarm.
注意有些alarm未必是真的存在问题。
 
Check the type of the object.
 
Lob Index on temporary table or IOT do not have a segment, than the problem message is a false alarm.
例如:临时表的LOB索引或者IOT表的索引不存在段,但是hcheck会抛出一个alarm。


附:
1.hout.sql

***Checked for relevance on 27-MAR-2013***
REM ======================================================================
REM hout.sql        Version 1.1    29 Dec 2000
REM
REM Purpose:
REM    To provide an output package for the h*.sql series of scripts.
REM     All h*.sql scripts use this package to output their results
REM    This allows one package to control where output is sent
REM    to.
REM    Eg: This package can be coded to output to DBMS_OUTPUT
REM        or to use the UTL_FILE calls if required.
REM
REM    This version of the script can write to both DBMS_OUTPUT and
REM    to the users trace file.
REM
REM Usage:
REM     See Note:101466.1 for details of using this and other h* packages
REM
REM Depends on:
REM    dbms_output , dbms_system
REM
REM Notes:
REM     Must be installed in SYS schema
REM    For Oracle 7.3, 8.0, 8.1, 9.0, 9.2, 10.1, 10.2, 11.1 and 11.2
REM     server versions
REM
REM CAUTION
REM   The sample program in this article is provided for educational
REM   purposes only and is NOT supported by Oracle Support Services.  
REM   It has been tested internally, however, and works as documented.  
REM   We do not guarantee that it will work for you, so be sure to test
REM   it in your environment before relying on it.
REM
REM ======================================================================
REM
create or replace package hOut as
 --
 -- Output options - change these to default as required
 -- You can override them at run time if required.
 --
  TO_DBMS_OUTPUT boolean := TRUE;    -- Send output to DBMS_OUTPUT
  TO_USER_TRACE  boolean := TRUE;    -- Send output to user trace file
  IGNORE_ERRORS  boolean := TRUE;    -- Ignore DBMS_OUTPUT errors if
                    -- also writing to the trace file
 --
 -- Output methods
 --
  procedure put_line(txt varchar2);
  procedure put(txt varchar2);
  procedure new_line;
  procedure wrap(txt varchar2, linelen number default 78);
  procedure rule_off;
 --
end hOut;
/
show errors
create or replace package body hOut as
  -- 7.3 has problems with ksdwrt as it uses the wrong length info
  -- putting nonsense on the end of lines.
  -- As a workaround we copy the text to a TMP varchar, append a chr(0)
  -- then reset the length back so we have an hidden chr(0) at the end
  -- of the string.
  tmp varchar2(2001);
  --
  APP_EXCEPTION EXCEPTION;
  pragma exception_init(APP_EXCEPTION, -20000);
  --
  procedure put_line(txt varchar2) is
  begin
    tmp:=txt||chr(0);
    tmp:=txt;
    if TO_DBMS_OUTPUT then
      begin
    dbms_output.put_line(txt);
      exception
    when APP_EXCEPTION then
      -- If DBMS_OUTPUT is full then carry on if we are writing to
      -- the trace file and ignoring errors, otherwise error now
      if TO_USER_TRACE and IGNORE_ERRORS then
        begin
          dbms_output.put_line('[TRUNCATED]');
            exception
          when APP_EXCEPTION then
          null;
        end;
      else
        raise;
      end if;
      end;
    end if;
    if TO_USER_TRACE then
    dbms_system.ksdwrt(1,tmp);
    end if;
  end;
 --
  procedure put(txt varchar2) is
  begin
    tmp:=txt||chr(0);
    tmp:=txt;
    if TO_DBMS_OUTPUT then
      begin
    dbms_output.put(txt);
      exception
    when APP_EXCEPTION then
      -- If DBMS_OUTPUT is full then carry on if we are writing to
      -- the trace file and ignoring errors, otherwise error now
      if TO_USER_TRACE and IGNORE_ERRORS then
        begin
          dbms_output.put('[TRUNCATED]');
            exception
          when APP_EXCEPTION then
          null;
        end;
      else
        raise;
      end if;
      end;
    end if;
    if TO_USER_TRACE then
    dbms_system.ksdwrt(1,tmp);
    end if;
  end;
 --
  procedure new_line is
  begin
    if TO_DBMS_OUTPUT then
      begin
    dbms_output.new_line;
      exception
    when APP_EXCEPTION then
      if TO_USER_TRACE and IGNORE_ERRORS then
        null;
      else
        raise;
      end if;
      end;
    end if;
    if TO_USER_TRACE then
    dbms_system.ksdwrt(1,' ');
    end if;
  end;
 --
  procedure wrap(txt varchar2, linelen number default 78) is
    p   integer:=1;
    len integer;
    pos integer;
    chunk varchar2(2000);
    xchunk varchar2(2000);
    llen number:=linelen;
  BEGIN
    if (llen>2000) then
    llen:=2000;
    end if;
    if (llen<=1) then
    llen:=78;
    end if;
    len:=length(txt);
    while (p<=len) loop
      chunk:=substr(txt,p,llen);
      pos:=instr(chunk,chr(10),-1);
      if pos>0 then
       -- We have a CR in the text - use it
       put_line(substr(chunk,1,pos-1));
       p:=p+pos;
      else
       -- No CR in the text so we will look for a split character
       xchunk:=translate(chunk,' ,()=',',,,,,');
       pos:=instr(xchunk,',',-1);
       if pos>0 and len>llen then
        put_line(substr(chunk,1,pos));
    p:=p+pos;
       else
        put(chunk);
    p:=p+llen;
       end if;
      end if;
    end loop;
    new_line;
  END;
 --
  procedure rule_off is
  begin
    put_line('=========================================================');
  end;
 --
begin
  dbms_output.enable(100000);
end hout;
/
REM ====================

2.hcheck使用方法
SQL> set serveroutput on size unlimited
SQL> spool outputfile
SQL> execute hcheck.full  
SQL> spool off

3.安装hcheck
先安装hOut,再安装hcheck2.sql(for 8i,不能运行于9I数据库)或hcheck3.sql(for 9i+)
4.hcheck3.sql
--
--------------------------------------------------------------------------
-- hcheck.sql          Version 3.50          Tue Mar 26 14:20:38 CEST 2013
--
-- Purpose:
--   To provide a single package which looks for common data dictionary
--   problems.
--     Note that this version has not been checked with locally managed
--     tablespaces and may give spurious output if these are in use.
--     This script is for use mainly under the guidance of Oracle Support.
--
-- Usage:
--   SQL> set serverout on size unlimited
--   SQL> exec hcheck.full [(parameters)]
--
--   Where parameters are
--        Verbose In Boolean - Verbose Output
--        RunAll  In Boolean - Run All procedures despite of Release
--        VerChk  In Number  - Check against 1st 'VerChk' release numbers
--
--   Output is to the hOut package to allow output to be redirected
--   as required
--
-- Depends on:
--   hOut
--
-- Notes:
--   Must be installed in SYS schema
--   This package is intended for use in Oracle releases 9i onwards
--   This package will NOT work in 8i or earlier.
--   In all cases any output reporting "problems" should be
--   parsed by an experienced Oracle Support analyst to confirm
--   if any action is required.
--
-- CAUTION
--   The sample program in this article is provided for educational
--   purposes only and is NOT supported by Oracle Support Services.
--   It has been tested internally, however, and works as documented.
--   We do not guarantee that it will work for you, so be sure to test
--   it in your environment before relying on it.
--
--------------------------------------------------------------------------
--

Create Or Replace Package hcheck Is
  Type sFuncNam Is Table Of Varchar2(32) Index By Binary_integer ;
  Type sFuncRel Is Table Of Varchar2(32) Index By Binary_integer ;
--
  sFn sFuncNam ;       /* Function Names                              */
  sFr sFuncRel ;       /* Version Control: Fixed Release per function */
--
-- Procedure Definitions
--
  Procedure SynLastDDLTim        
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /*  1 */
  Procedure LobNotInObj          
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /*  2 */
  Procedure MissingOIDOnObjCol   
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /*  3 */
  Procedure SourceNotInObj       
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /*  4 */
  Procedure IndIndparMismatch    
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /*  5 */
  Procedure InvCorrAudit         
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /*  6 */
  Procedure OversizedFiles       
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /*  7 */
  Procedure TinyFiles            
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /*  8 */
  Procedure PoorDefaultStorage   
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /*  9 */
  Procedure PoorStorage          
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 10 */
  Procedure MissTabSubPart       
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 11 */
  Procedure PartSubPartMismatch  
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 12 */
  Procedure TabPartCountMismatch
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 13 */
  Procedure OrphanedTabComPart
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 14 */
  Procedure ZeroTabSubPart
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 15 */
  Procedure MissingSum$
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 16 */
  Procedure MissingDir$
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 17 */
  Procedure DuplicateDataobj
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 18 */
  Procedure ObjSynMissing
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 19 */
  Procedure ObjSeqMissing
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 20 */
  Procedure OrphanedUndo
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 22 */
  Procedure OrphanedIndex
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 21 */
  Procedure OrphanedIndexPartition
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 23 */
  Procedure OrphanedIndexSubPartition
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 24 */
  Procedure OrphanedTable
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 25 */
  Procedure OrphanedTablePartition
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 26 */
  Procedure OrphanedTableSubPartition
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 27 */
  Procedure MissingPartCol
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 28 */
  Procedure OrphanedSeg$
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 29 */
  Procedure OrphanedIndPartObj#
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 30 */
  Procedure DuplicateBlockUse
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 31 */
  Procedure HighObjectIds
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 32 */
  Procedure PQsequence
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 33 */
  Procedure TruncatedCluster
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 34 */
  Procedure FetUet
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 35 */
  Procedure Uet0Check
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 36 */
  Procedure ExtentlessSeg
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 37 */
  Procedure SeglessUET
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 38 */
  Procedure BadInd$
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 39 */
  Procedure BadTab$
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 40 */
  Procedure BadIcolDepCnt
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 41 */
  Procedure WarnIcolDep
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 42 */
  Procedure OnlineRebuild$
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 43 */
  Procedure DropForceType
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 44 */
  Procedure TrgAfterUpgrade
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 45 */
  Procedure FailedInitJVMRun
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 46 */
  Procedure TypeReusedAfterDrop
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 47 */
  Procedure Idgen1$TTS
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 48 */
  Procedure DroppedFuncIdx
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 49 */
  Procedure BadOwner
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 50 */
  Procedure UpgCheckc0801070
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 51 */
  Procedure BadPublicObjects
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 52 */
  Procedure BadSegFreelist
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 53 */
  Procedure BadCol#
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 54 */
  Procedure BadDepends
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 55 */
  Procedure CheckDual
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 56 */
  Procedure ObjectNames
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 57 */
  Procedure BadCboHiLo
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 58 */
  Procedure ChkIotTs
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 59 */
  Procedure NoSegmentIndex
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 60 */
  Procedure BadNextObject
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 61 */
  Procedure OrphanIndopt
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 62 */
  Procedure UpgFlgBitTmp
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 63 */
  Procedure RenCharView
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 64 */
  Procedure Upg9iTab$
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 65 */
  Procedure Upg9iTsInd
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 66 */
  Procedure Upg10gInd$
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 67 */
  Procedure DroppedROTS
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 68 */
  Procedure ChrLenSmtcs
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 69 */
  Procedure FilBlkZero
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 70 */
  Procedure DbmsSchemaCopy
           (nF In Number Default 0, VerChk In Number Default 5,
            Verbose In Boolean Default FALSE) ; /* 71 */
--
  bRun  Boolean      ;
  nFunc Number := 71 ; /* should be equal-to, not one-greater-than, the   */
                       /* highest expected number of procedures to be run */
--
-- Function  CatV2nCatV ( s In Varchar2, n in Number default 5 ) Return Number ;
-- Procedure ChecknCatVnFR ( nCatV In Number, nFR In Number ) ;
--
-- Main
--
  Procedure Full (Verbose In Boolean Default FALSE,
                  RunAll  In Boolean Default FALSE,
                  VerChk  In Number  Default 5) ;
End hcheck;
/

Create Or Replace Package Body hcheck Is
    Ver        Varchar2(10) := '9i+/hc3.50';
    Warn       Number       :=0            ;
    Fatal      Number       :=0            ;
    CatV       Varchar2(10)                ;
    nCatV      Number       :=0            ;
    Verbose    Boolean                     ;
    nFR        Number       :=0            ; /* Fixed Release */
--
  Function InitsFr Return sFuncRel Is
    AllReleases Varchar2(32) := '99.99.99.99.99' ;
  Begin
--
-- Highest Relevant Release For Functions
-- If check against all releases, specify '99.99.99.99.99'
--
    sFr (0) := AllReleases            ; /*  0 */
    sFr (1) := '10.1.0.2.0'           ; /*  1 */
    sFr (2) := '10.0.0.2.0'           ; /*  2 */
    sFr (3) := AllReleases            ; /*  3 */
    sFr (4) := '10.2.0.1.0'           ; /*  4 */
    sFr (5) := '11.2.0.1.0'           ; /*  5 */
    sFr (6) := '11.2.0.1.0'           ; /*  6 */
    sFr (7) := AllReleases            ; /*  7 */
    sFr (8) :=  '9.0.1.0.0'           ; /*  8 */
    sFr (9) := AllReleases            ; /*  9 */
    sFr(10) := AllReleases            ; /* 10 */
    sFr(11) :=  '9.0.1.0.0'           ; /* 11 */
    sFr(12) := '11.2.0.1.0'           ; /* 12 */
    sFr(13) := AllReleases            ; /* 13 */
    sFr(14) :=  '9.0.1.0.0'           ; /* 13 */
    sFr(15) :=  '9.2.0.1.0'           ; /* 15 */
    sFr(16) := AllReleases            ; /* 16 */
    sFr(17) := AllReleases            ; /* 17 */
    sFr(18) := AllReleases            ; /* 18 */
    sFr(19) := AllReleases            ; /* 19 */
    sFr(20) := AllReleases            ; /* 20 */
    sFr(21) := AllReleases            ; /* 21 */
    sFr(22) := AllReleases            ; /* 22 */
    sFr(23) := AllReleases            ; /* 23 */
    sFr(24) := AllReleases            ; /* 24 */
    sFr(25) := AllReleases            ; /* 25 */
    sFr(26) := AllReleases            ; /* 26 */
    sFr(27) := AllReleases            ; /* 27 */
    sFr(28) := AllReleases            ; /* 28 */
    sFr(29) := AllReleases            ; /* 29 */
    sFr(30) := '11.1.0.6.0'           ; /* 30 */
    sFr(31) := AllReleases            ; /* 31 */
    sFr(32) :=  '8.1.6.0.0'           ; /* 32 */
    sFr(33) :=  '8.0.6.0.0'           ; /* 33 */
    sFr(34) :=  '8.1.7.0.0'           ; /* 34 */
    sFr(35) := AllReleases            ; /* 35 */
    sFr(36) := AllReleases            ; /* 36 */
    sFr(37) := AllReleases            ; /* 37 */
    sFr(38) := AllReleases            ; /* 38 */
    sFr(39) := AllReleases            ; /* 39 */
    sFr(40) := AllReleases            ; /* 40 */
    sFr(41) := '11.1.0.7.0'           ; /* 41 */
    sFr(42) := '11.1.0.7.0'           ; /* 42 */
    sFr(43) := AllReleases            ; /* 43 */
    sFr(44) := '10.1.0.2.0'           ; /* 44 */
    sFr(45) := AllReleases            ; /* 45 */
    sFr(46) := AllReleases            ; /* 46 */
    sFr(47) :=  '9.0.1.0.0'           ; /* 47 */
    sFr(48) :=  '9.0.1.0.0'           ; /* 48 */
    sFr(49) :=  '9.2.0.1.0'           ; /* 49 */
    sFr(50) :=  '9.0.1.0.0'           ; /* 50 */
    sFr(51) := AllReleases            ; /* 51 */
    sFr(52) := AllReleases            ; /* 52 */
    sFr(53) := AllReleases            ; /* 53 */
    sFr(54) := '10.1.0.2.0'           ; /* 54 */
    sFr(55) := AllReleases            ; /* 55 */
    sFr(56) := AllReleases            ; /* 56 */
    sFr(57) := AllReleases            ; /* 57 */
    sFr(58) := AllReleases            ; /* 58 */
    sFr(59) := AllReleases            ; /* 59 */
    sFr(60) := AllReleases            ; /* 60 */
    sFr(61) := AllReleases            ; /* 61 */
    sFr(62) :=  '9.2.0.8.0'           ; /* 62 */
    sFr(63) := '10.1.0.1.0'           ; /* 63 */
    sFr(64) := '10.1.0.1.0'           ; /* 64 */
    sFr(65) :=  '9.2.0.4.0'           ; /* 65 */
    sFr(66) :=  '9.2.0.5.0'           ; /* 66 */
    sFr(67) := '10.2.0.0.0'           ; /* 67 */
    sFr(68) := AllReleases            ; /* 68 */
    sFr(69) := '11.1.0.6.0'           ; /* 69 */
    sFr(70) := AllReleases            ; /* 70 */
    sFr(71) := AllReleases            ; /* 70 */
--
    Return sFr ;
  End ;
--
  Function Owner (uid Number) Return Varchar2 Is
    r          Varchar2(30) := Null        ;
  Begin
    Select name Into r
    From   user$
    where  user# = uid ;

    return r ;
  Exception
    When NO_DATA_FOUND Then
      Return ( '*UnknownOwnID='||uid||'*' ) ;
  End ;
--
  Function ObjName (objid Number) Return Varchar2 Is
    r          Varchar2(30) := Null        ;
    own        Number                      ;
  Begin
    Select name, owner# Into r, own
    From   obj$
    Where  Obj# = objid ;
    return r ;
  Exception
    When NO_DATA_FOUND Then
      Return ( '*UnknownObjID='||objid||'*' ) ;
  End ;
--
  Function IsLastPartition( o number ) Return Boolean Is
    n Number := 0 ;
  Begin
    Select partcnt Into n From partobj$ where obj#=o ;
    If ( n>1 ) Then
      Return(FALSE) ;
    Else
      Return(TRUE) ;
    End If ;
  End;
--
  Function ObjectIsTemporary( o Number ) Return Boolean
  -- Return TRUE if object is a TEMPORARY object
  -- Return NULL if object does not exist
  -- Return FALSE if object is not temporary
  Is
    Cursor cIsTemp Is
      Select Bitand(nvl(flags,0), 2) IsTemp From obj$ Where obj#=o
    ;
    ret Boolean := FALSE ;
  begin
    For R in cIsTemp Loop -- For loop just to keep cursor closed
      If ( R.IsTemp=2 ) Then
        ret := TRUE ;
      End If;
    End Loop ;
    return ret ;
  End;
--
  Procedure DictAt( ts number, fi number, bl number ) is
   Cursor cDictAt is
     select typ, ts#,file#,block#,count('x') CNT
      from (
    select 'UNDO$' typ, u.ts#, u.file#, u.block# from undo$ u
         where decode(u.status$,1,null,u.status$) is not null
    UNION ALL
    select 'TAB$'        typ, a.ts#,a.file#,a.block# from tab$        a
    UNION ALL
    select 'CLU$'        typ, b.ts#,b.file#,b.block# from clu$        b
    UNION ALL
    select 'TABPART$'    typ, c.ts#,c.file#,c.block# from tabpart$    c
    UNION ALL
    select 'TABSUBPART$' typ, d.ts#,d.file#,d.block# from tabsubpart$ d
    UNION ALL
    select 'IND$'        typ, e.ts#,e.file#,e.block# from ind$        e
    UNION ALL
    select 'INDPART$'    typ, f.ts#,f.file#,f.block# from indpart$    f
    UNION ALL
    select 'INDSUBPART$' typ, g.ts#,g.file#,g.block# from indsubpart$ g
    UNION ALL
    select 'LOB$'        typ, h.ts#,h.file#,h.block# from lob$        h
    UNION ALL
    select 'LOBFRAG$'    typ, i.ts#,i.file#,i.block# from lobfrag$    i
--  UNION ALL
--  select 'RECYCLEBIN$' typ, j.ts#,j.file#,j.block# from recyclebin$ j
       )
       where ts#= TS and file# = FI and block#= BL
       group by typ, ts#,file#,block#
      ;
  Begin
   For R in cDictAt
   Loop
     hout.put_line('^  '||R.typ||' has '||R.cnt||' rows');
   End Loop;
  End;
--
  function IndexIsNosegment( o number ) return boolean is
   Cursor cX is
    select bitand(flags,4096) noseg from ind$ where obj#=o;
   ret boolean:=null;
  begin
   For C in cX
   loop
     if C.noseg=4096 then
    ret:=true;
     else
    ret:=false;
     end if;
   end loop;
   return ret;  /* true/false or NULL if not found */
  end;
--
   Procedure CheckIndPart( o number ) is
    Cursor Cchk is
    select  i.obj#, i.dataobj#, i.ts#, i.file#, i.block#
          from indpart$ i
     where i.bo#=o
       and (i.file#!=0 OR i.block#!=0);
   begin
    For R in Cchk Loop
     hout.put_line(' ^- PROBLEM: Child INDPART$ with FILE/BLK (bug 4683380)');
     hout.put_line(' ^- ( OBJ='||R.obj#|| ' DOBJ='||r.dataobj#||
        ' TS='||r.TS#||
        ' RFILE/BLOCK='||r.file#||' '||r.block#||')' );
     Fatal:=Fatal+1;
    end loop;
   end;
--
  Procedure ChecknCatVnFR ( nCatV In     Number,
                            nFR   In     Number,
                            bRun  In Out Boolean) Is
    str1 Varchar2(10) := To_Char(nCatV) ;
    str2 Varchar2(10) := To_Char(nFR)   ;
  Begin
    Case
      When ( nCatV =          0 ) Then
        str1 := '*Any Rel*' ;
    Else
      Null ;
    End Case ;
    Case
      When ( nFR   = 9999999999 ) Then
        str2 := '*All Rel*' ;
      Else
        Null ;
    End Case ;
    If ( nCatV > nFR ) Then
      hout.put_line(Rpad(nCatv,10,' ')||' > '||Lpad(nFR,11,' ')||' : n/a');
      bRun := FALSE ;
      return ;
    Else
      hout.put_line(Rpad(str1,10,' ')||' <='||Lpad(str2,11,' ')||' : Ok') ;
      bRun := TRUE ;
    End If ;
  End ;
--
  Procedure strtok (tok In Out Varchar2, s In Out Varchar2, ct In Varchar2) Is
    i           Pls_integer      ;
    p           Pls_integer      ;
    len         Pls_integer      ;
    token_start Pls_integer      ;
    intoken     Boolean := FALSE ;
  Begin
    -- dbms_output.put_line ( 'strtok string: '||s ) ;
    If ( s Is Not NULL ) Then
      len := length( s ) ;
      i   := 1 ;
      While ( i <= len ) Loop
        p := instr( ct, substr(s,i,1) );
        If ( ( i = len ) Or ( p > 0 ) ) Then
          If ( intoken ) Then
            If ( p > 0 ) Then
              tok := substr( s, token_start, i - token_start ) ;
              s   := substr( s, i+1 ) ;
            Else
              tok := substr( s, token_start, i - token_start + 1 ) ;
              s   := '' ;
            End If ;
            Exit When TRUE ;
          End If ;
        Elsif ( Not intoken ) Then
            intoken := true ;
            token_start := i ;
        End If;
        tok := s ;
        i := i + 1 ;
      End Loop;
    End if;
  End;
--
  Function CatV2nCatV ( s In Varchar2, n in Number default 5 ) Return Number As
    type tok is table of Number index by binary_integer ;
    tk tok ;
    scp varchar2(16) ;
    i number := 1 ;
    scv Varchar2(16) := Null ;
  Begin
    scp := s ;
    for i in 1..n loop
      tk(i) := Null ;
      strtok( tk(i), scp, '.' );
      scv := scv || Lpad(tk(i),2,'0') ;
    end loop ;
    return To_Number(scv) ;
  end;
--
  Procedure SynLastDDLTim
           (nF      In Number  Default 0,
            VerChk  In Number  Default 5,
            Verbose In Boolean Default FALSE)
  Is
    Cursor sCur1 Is
      Select Distinct o.obj#, o.owner#, o.name
      From   obj$ o, idl_ub1$ i
      Where  type#  = 5
      And    ctime != mtime
      And    i.obj# = o.obj#    /* Has IDL information */
      ;
    nFr  Number ;
    ps1  Varchar2(10) := 'HCKW-0001' ;
    ps1a Varchar2(65) :=
         'Synonym''s LAST_DDL_TIME != CREATED' ;
    bug1 Varchar2(80) :=
         'Ref    : Bug:2371453' ;
    aff1 Varchar2(80) := 'Affects: Vers >=8.1.7.2 and BELOW 10.1 - '||
         'Specifically: 8.1.7.4 9.0.1.3 9.2.0.1' ;
    fix1 Varchar2(80) :=
         'Fixed  : 8.1.7.5 9.0.1.4 9.2.0.2 10.1.0.2' ;
    tag1 Varchar2(80) :=
         'CORR/DIC HCHECK '||ps1 ;
    not1 Varchar2(80) :=
         'Note: 2371453.8 - CREATE OR REPLACE SYNONYM can lead to inconsistent';
    not2 Varchar2(80) :=
         '                  dictionary (old IDL data)' ;
    CursorRun Boolean := FALSE ; V Boolean := Verbose ;
    Begin
      If ( nF = 0) Then
        sFr := InitsFr ;
      End If ;
      If ( nF = 0) Then
        sFr := InitsFr ;
      End If ;
      nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
      ChecknCatVnFR (nCatV, nFR, bRun) ;
      If ( bRun = FALSE ) Then return ; End If ;
      For c1 in sCur1 Loop
        If (ps1 Is Not Null) Then
            CursorRun := TRUE ;
            hout.put_line (chr(10)||ps1||': '||ps1a) ;
            ps1:=null;
        End If;
         If ( V ) Then
          if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
          if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
          if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
          if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
          if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
          if (not2 Is Not Null) Then hout.put_line(not2); not2:=null; End If;
          hout.put(chr(10)); V := FALSE ;
        End If ;
        hout.put_line(' OBJ#='||c1.OBJ#||' Name='||Owner(c1.owner#)||'.'||
                      c1.name);
        Warn := Warn + 1 ;
      End Loop ;
      If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
    End ;
--
  Procedure LobNotInObj
           (nF      In Number  Default 0,
            VerChk  In Number  Default 5,
            Verbose In Boolean Default FALSE)
  Is
    nFr  Number ;
    Cursor sCur1 Is
      Select l.obj#, l.lobj#
      From   lob$ l, obj$ o
      Where  l.lobj# = o.obj#(+)
      And    o.obj# is null
      ;
    ps1  Varchar2(10) := 'HCKE-0001' ;
    ps1a Varchar2(65) := 'LOB$.LOBJ# not found in OBJ$' ;
    bug1 Varchar2(80) :=
         'Ref    : Bug:2405258' ;
    aff1 Varchar2(80) :=
         'Affects: Vers >=8 and BELOW 10.1 - Specifically: 9.2.0.1' ;
    fix1 Varchar2(80) :=
         'Fixed  : 9.2.0.2 10.1.0.2' ;
    tag1 Varchar2(80) :=
         'CORR/DIC HCHECK '||ps1 ;
    not1 Varchar2(80) :=
         'Note: 2405258.8 - Dictionary corruption / OERI(15265) from MOVE LOB' ;
    not2 Varchar2(80) :=
         '                  to existing segment name' ;
    CursorRun Boolean := FALSE ; V Boolean := Verbose ;
    Begin
      If ( nF = 0) Then
        sFr := InitsFr ;
      End If ;
      If ( nF = 0) Then
        sFr := InitsFr ;
      End If ;
      nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
      ChecknCatVnFR (nCatV, nFR, bRun) ;
      If ( bRun = FALSE ) Then return ; End If ;
      For c1 In sCur1 Loop
        If (ps1 Is Not Null) Then
            CursorRun := TRUE ;
            hout.put_line (chr(10)||ps1||': '||ps1a) ;
            ps1:=null;
        End If;
         If ( V ) Then
          if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
          if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
          if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
          if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
          if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
          if (not2 Is Not Null) Then hout.put_line(not2); not2:=null; End If;
          hout.put(chr(10)); V := FALSE ;
        End If ;
        hout.put_line(' LOB$.LOBJ# has no OBJ$ entry for LOBJ#='||c1.lobj#||
                      ' (OBJ#='||c1.obj#||')');
        Fatal := Fatal + 1 ;
      End Loop ;
      If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
    End ;
--
  Procedure MissingOIDOnObjCol
           (nF      In Number  Default 0,
            VerChk  In Number  Default 5,
            Verbose In Boolean Default FALSE)
  Is
    nFr  Number ;
    Cursor sCur1 Is
      Select o.obj# , o.type#, o.owner#, o.name, c.col#, c.intcol#,
               c.name cname, t.property
      From   obj$ o, col$ c, coltype$ ct, oid$ oi, tab$ t
      Where  o.obj#     = ct.obj#
      And    ct.obj#    = c.obj#
      And    ct.col#    = c.col#
      And    ct.intcol# = c.intcol#
      And    oi.oid$(+) = ct.toid
      And    o.obj#     = t.obj#(+)
      And    oi.oid$ is null
      ;
    ps1  Varchar2(10) := 'HCKE-0002' ;
    ps1a Varchar2(65) := 'Object type column with missing OID$' ;
    bug1 Varchar2(80) :=
         'Ref    : Bug:2728624' ;
    aff1 Varchar2(80) :=
         'Affects: Closed as not a Bug (92)' ;
    fix1 Varchar2(80) :=
         'Fixed  : See Note.229583.1 for patching steps' ;
    tag1 Varchar2(80) :=
         'CORR/DIC HCHECK '||ps1 ;
    not1 Varchar2(80) :=
         'Note.229583.1 - Bug:2728624 - Confirmation and Patching Notes' ;
    CursorRun Boolean := FALSE ; V Boolean := Verbose ;
    Begin
      If ( nF = 0) Then
        sFr := InitsFr ;
      End If ;
      If ( nF = 0) Then
        sFr := InitsFr ;
      End If ;
      nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
      ChecknCatVnFR (nCatV, nFR, bRun) ;
      If ( bRun = FALSE ) Then return ; End If ;
      For c1 In sCur1 Loop
        If (ps1 Is Not Null) Then
            CursorRun := TRUE ;
            hout.put_line (chr(10)||ps1||': '||ps1a) ;
            ps1:=null;
        End If;
         If ( V ) Then
          if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
          if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
          if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
          if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
          if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
          hout.put(chr(10)); V := FALSE ;
        End If ;
        hout.put_line(' OBJ#='||c1.obj#||' Name='||Owner(c1.owner#)||'.'
                      ||c1.name||' IntCol#='||c1.intcol#||'='||c1.cname
                      ||' TabProp='||c1.property);
        Fatal := Fatal + 1 ;
      End Loop ;
      If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
    End ;
--
  Procedure SourceNotInObj
           (nF      In Number  Default 0,
            VerChk  In Number  Default 5,
            Verbose In Boolean Default FALSE)
  Is
    nFr  Number ;
    Cursor sCur1 Is
      Select Count('x') cnt, Count(Distinct s.obj#) nobj
      From   source$ s, obj$ o
      Where  s.obj# = o.obj#(+)
      And    o.obj# is null
      Having Count('x') > 0
      ;
    ps1  Varchar2(10) := 'HCKE-0003' ;
    ps1a Varchar2(65) := 'SOURCE$ for OBJ# not in OBJ$' ;
    bug1 Varchar2(80) :=
         'Ref    : Bug:3532977' ;
    aff1 Varchar2(80) :=
         'Affects: Vers BELOW 10.2   Specifically: 9.2.0.4 10.1.0.4' ;
    fix1 Varchar2(80) :=
         'Fixed  : 9.2.0.8 10.1.0.5 10.2.0.1' ;
    tag1 Varchar2(80) :=
         'CORR/DIC HCHECK '||ps1 ;
    not1 Varchar2(80) := Null ;
    CursorRun Boolean := FALSE ; V Boolean := Verbose ;
    Begin
      If ( nF = 0) Then
        sFr := InitsFr ;
      End If ;
      nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
      ChecknCatVnFR (nCatV, nFR, bRun) ;
      If ( bRun = FALSE ) Then return ; End If ;
      For c1 In sCur1 Loop
        If (ps1 Is Not Null) Then
            CursorRun := TRUE ;
            hout.put_line (chr(10)||ps1||': '||ps1a) ;
            ps1:=null;
        End If;
         If ( V ) Then
          if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
          if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
          if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
          if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
          if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
          hout.put(chr(10)); V := FALSE ;
        End If ;
        hout.put_line('SOURCE$ has '||c1.cnt||
             ' rows for '||c1.nobj||' OBJ# values not in OBJ$' ) ;
        Fatal := Fatal + 1 ;
      End Loop ;
      If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
    End ;
--
  Procedure IndIndparMismatch
           (nF      In Number  Default 0,
            VerChk  In Number  Default 5,
            Verbose In Boolean Default FALSE)
  Is
    nFr  Number ;
    Cursor sCur1 Is
      Select io.obj# io, io.name ionam, ipo.obj# ipo, ipo.name iponam
      From   obj$ io, indpart$ ip, obj$ ipo
      Where  ipo.type#         = 20  /* IND PART */
      And    ip.obj#           = ipo.obj#
      And    io.obj# (+)       = ip.bo#
      And    nvl(io.name,'"') != ipo.name
      ;
    ps1  Varchar2(10) := 'HCKE-0004' ;
    ps1a Varchar2(65) := 'OBJ$.NAME mismatch for INDEX v INDEX PARTITION' ;
    bug1 Varchar2(80) :=
         'Ref    : Bug:3753873' ;
    aff1 Varchar2(80) :=
         'Affects: Vers BELOW 11.2 - Specifically: All 9.2 rels '||
         '(9.2.0.4 through 9.2.0.8)' ;
    aff2 Varchar2(80) :=
         '         10.1.0.5 10.2.0.1 10.2.0.2 10.2.0.3 10.2.0.4 11.1.0.7' ;
    fix1 Varchar2(80) :=
         'Fixed  : 11.2.0.1.0' ;
    tag1 Varchar2(80) :=
         'CORR/DIC HCHECK '||ps1 ;
    not1 Varchar2(80) :=
         'Note:3753873.8 - Minor dictionary corruption from DROP COLUMN' ;
    not2 Varchar2(80) :=
         '                 of partitioned table with LOB' ;
    CursorRun Boolean := FALSE ; V Boolean := Verbose ;
    Begin
      If ( nF = 0) Then
        sFr := InitsFr ;
      End If ;
      nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
      ChecknCatVnFR (nCatV, nFR, bRun) ;
      If ( bRun = FALSE ) Then return ; End If ;
      For c1 In sCur1 Loop
        If (ps1 Is Not Null) Then
            CursorRun := TRUE ;
            hout.put_line (chr(10)||ps1||': '||ps1a) ;
            ps1:=null;
        End If;
         If ( V ) Then
          if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
          if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
          if (aff2 Is Not Null) Then hout.put_line(aff2); aff1:=null; End If;
          if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
          if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
          if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
          if (not2 Is Not Null) Then hout.put_line(not2); not2:=null; End If;
          hout.put(chr(10)); V := FALSE ;
        End If ;
        hout.put_line(' Ind Part OBJ$.OBJ# '||c1.ipo||' '||c1.iponam||
                '!='||c1.ionam||' OBJ#='||c1.io);
        Fatal := Fatal + 1 ;
      End Loop ;
      If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
    End ;
--
  Procedure InvCorrAudit
           (nF      In Number  Default 0,
            VerChk  In Number  Default 5,
            Verbose In Boolean Default FALSE)
  Is
    nFr  Number ;
    Cursor sCur1 Is
      Select decode(aud.user#,
                      0, 'ANY CLIENT',
                      1, Null        ,
                      client.name)     username ,
             proxy.name                proxyname,
             prv.name                  privilege,
             decode(aud.success,
                      1, 'BY SESSION',
                      2, 'BY ACCESS' ,
                      'NOT SET')       success  ,
             decode(aud.failure,
                      1, 'BY SESSION',
                      2, 'BY ACCESS' ,
                      'NOT SET')       failure
      From   sys.user$                 client   ,
             sys.user$                 proxy    ,
             system_privilege_map      prv      ,
             sys.audit$                aud
      Where  aud.option# = -prv.privilege
      and aud.user#      = client.user#
      -- and aud.user#     != 1               /* PUBLIC */
      and aud.user#      = 0               /* SYS */
      and aud.proxy#     = proxy.user# (+)
      and aud.proxy# is null
    ;
    ps1  Varchar2(10) := 'HCKE-0005' ;
    ps1a Varchar2(65) := 'Invalid/Corrupted AUDIT$ entries' ;
    bug1 Varchar2(80) :=
         'Ref    : Bug:6310840' ;
    aff1 Varchar2(80) :=
         'Affects: Vers BELOW 11.2 - Specifically: 11.1.0.6' ;
    fix1 Varchar2(80) :=
         'Fixed  : 11.1.0.7 11.2.0.1' ;
    tag1 Varchar2(80) :=
         'CORR/DIC HCHECK '||ps1 ;
    not1 Varchar2(80) :=
         'Note.455565.1: Corrupted entries in DBA_PRIV_AUDIT_OPTS' ;
    CursorRun Boolean := FALSE ; V Boolean := Verbose ;
    variant Varchar2(30) := Null ;
    Begin
      If ( nF = 0) Then
        sFr := InitsFr ;
      End If ;
      nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
      ChecknCatVnFR (nCatV, nFR, bRun) ;
      If ( bRun = FALSE ) Then return ; End If ;
      For c1 In sCur1 Loop
        If (ps1 Is Not Null) Then
            CursorRun := TRUE ;
            hout.put_line (chr(10)||ps1||': '||ps1a) ;
            ps1:=null;
        End If;
         If ( V ) Then
          if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
          if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
          if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
          if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
          if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
          hout.put(chr(10)); V := FALSE ;
        End If ;
        If (c1.username = 'ANY CLIENT')
        Then
          variant := 'Corrupted -' ;
        Else
          variant := 'Invalid   -' ;
        End If ;
        hout.put_line(variant||' USER#='''||c1.username||''' OPTION='''||
                   c1.privilege||''' SUCCESS='''||c1.success||''' FAILURE='''||
                   c1.failure||'''');
        Fatal := Fatal + 1 ;
      End Loop;
      If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
    End;
--
  Procedure OversizedFiles
           (nF      In Number  Default 0,
            VerChk  In Number  Default 5,
            Verbose In Boolean Default FALSE)
  Is
    nFr  Number ;
    Cursor sCur1 Is
      Select f.ts# TS, f.relfile# RFILE, f.file# AFILE, v.name NAME, f.blocks
      From   ts$ ts, file$ f, v$datafile v
      Where  ts.ts#                = f.ts#
      And    v.file#               = f.file#
      And    f.blocks              > 4194303 -- (4M -1 blocks)
      And    bitand(ts.flags,256) != 256
      Order  By f.ts#, f.relfile#
      ;
    ps1  Varchar2(10) := 'HCKE-0006' ;
    ps1a Varchar2(65) := 'Oversized datafile (blocks>4194303)' ;
    bug1 Varchar2(80) := Null ;
    aff1 Varchar2(80) := Null ;
    fix1 Varchar2(80) := Null ;
    tag1 Varchar2(80) :=
         'CORR/DIC HCHECK '||ps1 ;
    not1 Varchar2(80) := Null ;
    CursorRun Boolean := FALSE ; V Boolean := Verbose ;
    Begin
      If ( nF = 0) Then
        sFr := InitsFr ;
      End If ;
      nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
      ChecknCatVnFR (nCatV, nFR, bRun) ;
      If ( bRun = FALSE ) Then return ; End If ;
      For c1 In sCur1 Loop
        If (ps1 Is Not Null) Then
            CursorRun := TRUE ;
            hout.put_line (chr(10)||ps1||': '||ps1a) ;
            ps1:=null;
        End If;
         If ( V ) Then
          if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
          if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
          if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
          if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
          if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
          hout.put(chr(10)); V := FALSE ;
        End If ;
        hout.put_line(' OVERSIZED FILE ('||c1.blocks||' blocks) TS='||c1.TS||
            ' RFILE='||c1.RFILE||
            ' ABS='||c1.AFILE||' Name='||c1.NAME);
        Fatal := Fatal + 1 ;
      End Loop ;
      If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
    End ;
--
  Procedure TinyFiles
           (nF      In Number  Default 0,
            VerChk  In Number  Default 5,
            Verbose In Boolean Default FALSE)
  Is
    nFr  Number ;
    Cursor sCur1 Is
      select file#, ts#, blocks
      from   file$
      where  status$ = 2
      and blocks    <= 1
      ;
    ps1  Varchar2(10) := 'HCKE-0007' ;
    ps1a Varchar2(65) := 'Tiny File size in FILE$' ;
    bug1 Varchar2(80) :=
         'Ref    : Bug:1646512' ;
    aff1 Varchar2(80) :=
         'Affects: Vers BELOW 9.0 - Specifically: 8.1.7.3' ;
    fix1 Varchar2(80) :=
         'Fixed  : 8.1.7.4 9.0.1.0' ;
    tag1 Varchar2(80) :=
         'CORR/DIC HCHECK '||ps1 ;
    not1 Varchar2(80) := Null ;
    CursorRun Boolean := FALSE ; V Boolean := Verbose ;
    Begin
      If ( nF = 0) Then
        sFr := InitsFr ;
      End If ;
      nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
      ChecknCatVnFR (nCatV, nFR, bRun) ;
      If ( bRun = FALSE ) Then return ; End If ;
      For c1 In sCur1 Loop
        If (ps1 Is Not Null) Then
            CursorRun := TRUE ;
            hout.put_line (chr(10)||ps1||': '||ps1a) ;
            ps1:=null;
        End If;
         If ( V ) Then
          if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
          if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
          if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
          if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
          if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
          hout.put(chr(10)); V := FALSE ;
        End If ;
        hout.put_line(' FILE$ FILE#='||c1.file#||' has BLOCKS='||c1.blocks);
        Fatal := Fatal + 1 ;
      End Loop ;
      If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
    End ;
--
  Procedure PoorDefaultStorage
           (nF      In Number  Default 0,
            VerChk  In Number  Default 5,
            Verbose In Boolean Default FALSE)
  Is
    nFr  Number ;
    Cursor sCur1 Is
      select tablespace_name, initial_extent, next_extent, min_extents,
             pct_increase, max_extents
      from   dba_tablespaces
      where (initial_extent < 1024*1024
             or
             contents='TEMPORARY')
       and   next_extent    < 65536
       and   min_extlen     < 65536
       and   pct_increase   <     5
       and   max_extents    >  3000
       ;
    ps1  Varchar2(10) := 'HCKW-0002' ;
    ps1a Varchar2(65) := 'Poor Default Storage Clauses For Tablespace' ;
    bug1 Varchar2(80) := Null ;
    aff1 Varchar2(80) := Null ;
    fix1 Varchar2(80) := Null ;
    tag1 Varchar2(80) :=
         'CORR/DIC HCHECK '||ps1 ;
    not1 Varchar2(80) :=
         'Note:50380.1 - ALERT: Using UNLIMITED Extent Format' ;
    CursorRun Boolean := FALSE ; V Boolean := Verbose ;
    Begin
      If ( nF = 0) Then
        sFr := InitsFr ;
      End If ;
      nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
      ChecknCatVnFR (nCatV, nFR, bRun) ;
      If ( bRun = FALSE ) Then return ; End If ;
      For c1 In sCur1 Loop
        If (ps1 Is Not Null) Then
          CursorRun := TRUE ;
          hout.put_line(chr(10)||ps1||': '||ps1a);
          hout.put_line('  '||rpad('Tablespace',30)||rpad('Init',10)||
               rpad('Next',10)||rpad('Min',10)||rpad('Pct',4)||
               'MaxExtents');
          ps1:=null;
        End If ;
         If ( V ) Then
          if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
          if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
          if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
          if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
          if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
          hout.put(chr(10)); V := FALSE ;
        End If ;
        hout.put_line('  '
            ||rpad(c1.tablespace_name,30)
            ||rpad(c1.initial_extent,10)
            ||rpad(c1.next_extent,10)
            ||rpad(c1.min_extents,10)
            ||rpad(c1.pct_increase,4)
            ||c1.max_extents );
        Warn := Warn + 1 ;
      End Loop ;
      If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
    End ;
--
  Procedure PoorStorage
           (nF      In Number  Default 0,
            VerChk  In Number  Default 5,
            Verbose In Boolean Default FALSE)
  Is
    nFr  Number ;
    Cursor sCur1 Is
      Select owner       ,
             segment_name,
             segment_type,
             next_extent ,
             extents     ,
             pct_increase,
             max_extents
      From   dba_segments
      Where (     initial_extent < 65535
              And next_extent    < 65536
              And pct_increase   <     5
              And max_extents    >  3000
              And extents        >   500
            ) Or extents         >  3000
    ;
    ps1  Varchar2(10) := 'HCKW-0003' ;
    ps1a Varchar2(65) := 'Poor Storage Clauses For Object(s)' ;
    bug1 Varchar2(80) := Null ;
    aff1 Varchar2(80) := Null ;
    fix1 Varchar2(80) := Null ;
    tag1 Varchar2(80) :=
         'CORR/DIC HCHECK '||ps1 ;
    not1 Varchar2(80) :=
         'Note:50380.1 - ALERT: Using UNLIMITED Extent Format' ;
    CursorRun Boolean := FALSE ; V Boolean := Verbose ;
    Begin
      If ( nF = 0) Then
        sFr := InitsFr ;
      End If ;
      nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
      ChecknCatVnFR (nCatV, nFR, bRun) ;
      If ( bRun = FALSE ) Then return ; End If ;
      For c1 In sCur1 Loop
        If (ps1 Is Not Null) Then
          CursorRun := TRUE ;
          hout.put_line (chr(10)||ps1||': '||ps1a) ;
          ps1:=null;
           If ( V ) Then
            if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
            if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
            if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
            if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
            if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
            hout.put(chr(10)); V := FALSE ;
          End If ;
          hout.put_line('  '||rpad('Segment',50)||rpad('Next',10)||
                        rpad('Exts',7)||rpad('Pct',4)||
                        'MaxExtents' ) ;
        End If;
--
        hout.put_line('  '||
                      rpad(c1.segment_type||' '
                      ||c1.owner||'.'
                      ||c1.segment_name,50)
                      ||rpad(c1.next_extent,10)
                      ||rpad(c1.extents,7)
                      ||rpad(c1.pct_increase,4)
                      ||c1.max_extents );
        Warn := Warn + 1 ;
      End Loop ;
      If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
    End ;
--
  Procedure MissTabSubPart
           (nF      In Number  Default 0,
            VerChk  In Number  Default 5,
            Verbose In Boolean Default FALSE)
  Is
    nFr  Number ;
    Cursor sCur1 Is
      Select o.obj#       part_obj# ,
             o.owner#               ,
             o.name                 ,
             o.subname              ,
             p.subpartcnt           ,
             p.bo#        table_obj#
      From   obj$         o         ,
             tabcompart$  p
      Where  o.type#      = 19      /* PARTITION                     */
      and    o.obj#       = p.obj#  /* Has subpartitions             */
      and    p.subpartcnt = 0       /* Has No entries in tabsubpart$ */
      ;
    Cursor sCur2 Is
      Select o.obj#       part_obj# ,
             o.owner#               ,
             o.name                 ,
             o.subname              ,
             p.subpartcnt           ,
             p.bo#        index_obj#
      from   obj$         o         ,
             indcompart$  p
      where  o.type#      = 20      /* INDEX PARTITION               */
      and    o.obj#       = p.obj#  /* Has subpartitions             */
      and    p.subpartcnt = 0       /* Has No entries in indsubpart$ */
    ;
    ps1  Varchar2(10) := 'HCKE-0008' ;
    ps1a Varchar2(65) := 'Missing TABSUBPART$ entry/entries' ;
    bug1 Varchar2(80) :=
         'Ref    : Bug:1360714' ;
    aff1 Varchar2(80) :=
         'Affects: Vers >=8.1.5 and BELOW 9.0 - Specifically: 8.1.7.1' ;
    fix1 Varchar2(80) :=
         'Fixed  : 8.1.7.2 9.0.1.0' ;
    tag1 Varchar2(80) :=
         'CORR/DIC HCHECK '||ps1 ;
    not1 Varchar2(80) := Null ;
    CursorRun Boolean := FALSE ; V Boolean := Verbose ;
    sMsg Boolean      := FALSE ;
    Begin
      If ( nF = 0) Then
        sFr := InitsFr ;
      End If ;
      nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
      ChecknCatVnFR (nCatV, nFR, bRun) ;
      If ( bRun = FALSE ) Then return ; End If ;
      For c1 In sCur1 Loop
        If (ps1 Is Not Null) Then
            CursorRun := TRUE ;
            hout.put_line (chr(10)||ps1||': '||ps1a) ;
            ps1:=null;
        End If;
         If ( V ) Then
          if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
          if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
          if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
          if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
          if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
          hout.put(chr(10)); V := FALSE ;
        End If ;
--
        hout.put_line(
          ' TABLE '||Owner(c1.owner#)||'.'||c1.name||
          ' Partition '||c1.subname||
          ' PartObj#='||c1.part_obj#||' TabObj#='||c1.table_obj#
        ) ;
        If ( IsLastPartition ( c1.table_obj# ) ) Then
          hout.put_line(' ^^ PARTOBJ$.PARTCNT<=1 - non standard corruption') ;
        End If ;
        If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
        Fatal := Fatal + 1 ;
      End Loop ;
--
      For c2 In sCur2 Loop
        If (ps1 Is Not Null) Then
            hout.put_line (chr(10)||ps1||': '||ps1a) ;
            ps1:=null;
        End If;
         If ( V ) Then
          if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
          if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
          if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
          if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
          if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
          hout.put(chr(10)); V := FALSE ;
        End If ;
--
        hout.put_line(
          ' INDEX '||Owner(c2.owner#)||'.'||c2.name||
          ' Partition '||c2.subname||
          ' PartObj#='||c2.part_obj#||' IndObj#='||c2.index_obj#);
        If ( IsLastPartition ( c2.index_obj# ) ) Then
          hout.put_line(' ^^ PARTOBJ$.PARTCNT<=1 - non standard corruption') ;
       End If;
       Fatal := Fatal+1 ;
       sMsg  := TRUE ;
      End Loop ;
      If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
--
      If ( sMsg ) Then
        hout.put_line('There are probably orphaned SEG$ entry/s with this') ;
      End If ;
    End ;
--
  Procedure PartSubPartMismatch
           (nF      In Number  Default 0,
            VerChk  In Number  Default 5,
            Verbose In Boolean Default FALSE)
  Is
    nFr  Number ;
    Cursor sCur1 Is
       Select po.obj#                              obj#   ,
              u.name owner,
              o.name name,
              Decode(o.type#, 1, 'INDEX', 'TABLE') type   ,
              Decode(po.parttype,
                     1, 'RANGE' ,
                     2, 'HASH'  ,
                     3, 'SYSTEM',
                     4, 'LIST'  ,
                     'Unknown')                    part   ,
              Decode(Mod(po.spare2, 256),
                     0, 'NONE'  ,
                     2, 'HASH'  ,
                     3, 'SYSTEM',
                     4, 'LIST'  ,
                     'Unknown')                    subpart
       From   partobj$                             po     ,
              obj$                                 o      ,
              user$                                u
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值