ITPub博客

首页 > 数据库 > Oracle > TOM的SHOW_SPACE修改版,能够保存到表。

TOM的SHOW_SPACE修改版,能够保存到表。

原创 Oracle 作者:qishao7232 时间:2015-08-10 17:43:50 0 删除 编辑
CREATE OR REPLACE PROCEDURE SHOW_SPACE_TABLE(V_SEGMENT_NAME   IN VARCHAR2,
                                             V_SEGMENT_OWNER  IN VARCHAR2 DEFAULT USER,
                                             V_SEGMENT_TYPE   IN VARCHAR2 DEFAULT 'TABLE',
                                             P_ANALYZED       IN VARCHAR2 DEFAULT 'Y',
                                             P_PARTITION_NAME IN VARCHAR2 DEFAULT NULL) AS
  P_SEGMENT_NAME  VARCHAR2(30);
  P_SEGMENT_OWNER VARCHAR2(30);
  P_SEGMENT_TYPE  VARCHAR2(30);
  P_SPACE         VARCHAR2(30);


  L_UNFORMATTED_BLOCKS NUMBER;
  L_UNFORMATTED_BYTES  NUMBER;
  L_FS1_BLOCKS         NUMBER;
  L_FS1_BYTES          NUMBER;
  L_FS2_BLOCKS         NUMBER;
  L_FS2_BYTES          NUMBER;
  L_FS3_BLOCKS         NUMBER;
  L_FS3_BYTES          NUMBER;
  L_FS4_BLOCKS         NUMBER;
  L_FS4_BYTES          NUMBER;
  L_FULL_BLOCKS        NUMBER;
  L_FULL_BYTES         NUMBER;


  L_FREE_BLKS          NUMBER;
  L_TOTAL_BLOCKS       NUMBER;
  L_TOTAL_BYTES        NUMBER;
  L_UNUSED_BLOCKS      NUMBER;
  L_UNUSED_BYTES       NUMBER;
  L_LASTUSEDEXTFILEID  NUMBER;
  L_LASTUSEDEXTBLOCKID NUMBER;
  L_LAST_USED_BLOCK    NUMBER;


  PROCEDURE P(P_LABEL IN VARCHAR2, P_NUM IN NUMBER) IS
  BEGIN
    DBMS_OUTPUT.PUT_LINE(RPAD(P_LABEL, 40, '.') || P_NUM);
  END;
BEGIN
  P_SEGMENT_NAME  := UPPER(V_SEGMENT_NAME);
  P_SEGMENT_OWNER := UPPER(V_SEGMENT_OWNER);
  P_SEGMENT_TYPE  := UPPER(V_SEGMENT_TYPE);


  IF (P_SEGMENT_TYPE = 'I' OR P_SEGMENT_TYPE = 'INDEX') THEN
    P_SEGMENT_TYPE := 'INDEX';
  ELSIF (P_SEGMENT_TYPE = 'T' OR P_SEGMENT_TYPE = 'TABLE') THEN
    P_SEGMENT_TYPE := 'TABLE';
  ELSIF (P_SEGMENT_TYPE = 'C' OR P_SEGMENT_TYPE = 'CLUSTER') THEN
    P_SEGMENT_TYPE := 'CLUSTER';
  END IF;


  EXECUTE IMMEDIATE 'select ts.segment_space_management from dba_segments seg, dba_tablespaces ts where seg.segment_name = :p_segname and (:p_partition is null or seg.partition_name = :p_partition) and seg.owner = :p_owner and seg.tablespace_name = ts.tablespace_name'
    INTO P_SPACE
    USING P_SEGMENT_NAME, P_PARTITION_NAME, P_PARTITION_NAME, P_SEGMENT_OWNER;


  DBMS_SPACE.UNUSED_SPACE(SEGMENT_OWNER             => P_SEGMENT_OWNER,
                          SEGMENT_NAME              => P_SEGMENT_NAME,
                          SEGMENT_TYPE              => P_SEGMENT_TYPE,
                          TOTAL_BLOCKS              => L_TOTAL_BLOCKS,
                          TOTAL_BYTES               => L_TOTAL_BYTES,
                          UNUSED_BLOCKS             => L_UNUSED_BLOCKS,
                          UNUSED_BYTES              => L_UNUSED_BYTES,
                          LAST_USED_EXTENT_FILE_ID  => L_LASTUSEDEXTFILEID,
                          LAST_USED_EXTENT_BLOCK_ID => L_LASTUSEDEXTBLOCKID,
                          LAST_USED_BLOCK           => L_LAST_USED_BLOCK,
                          PARTITION_NAME            => P_PARTITION_NAME);
/*  P('Total Blocks  ', L_TOTAL_BLOCKS);
  P('Total Bytes   ', L_TOTAL_BYTES);
  P('Total MBytes  ', L_TOTAL_BYTES / 1024 / 1024);
  P('Unused Blocks ', L_UNUSED_BLOCKS);
  P('Unused Bytes  ', L_UNUSED_BYTES);
  P('Unused KBytes ', L_UNUSED_BYTES / 1024);
  P('Used Blocks   ', L_TOTAL_BLOCKS - L_UNUSED_BLOCKS);
  P('Used Bytes    ', L_TOTAL_BYTES - L_UNUSED_BYTES);
  P('Used KBytes   ', (L_TOTAL_BYTES - L_UNUSED_BYTES) / 1024);
  P('Last Used Ext FileId', L_LASTUSEDEXTFILEID);
  P('Last Used Ext BlockId', L_LASTUSEDEXTBLOCKID);
  P('Last Used Block', L_LAST_USED_BLOCK);*/


  IF P_ANALYZED = 'Y' THEN
    IF P_SPACE = 'AUTO' THEN
      DBMS_SPACE.SPACE_USAGE(SEGMENT_OWNER      => P_SEGMENT_OWNER,
                             SEGMENT_NAME       => P_SEGMENT_NAME,
                             SEGMENT_TYPE       => P_SEGMENT_TYPE,
                             UNFORMATTED_BLOCKS => L_UNFORMATTED_BLOCKS,
                             UNFORMATTED_BYTES  => L_UNFORMATTED_BYTES,
                             FS1_BLOCKS         => L_FS1_BLOCKS,
                             FS1_BYTES          => L_FS1_BYTES,
                             FS2_BLOCKS         => L_FS2_BLOCKS,
                             FS2_BYTES          => L_FS2_BYTES,
                             FS3_BLOCKS         => L_FS3_BLOCKS,
                             FS3_BYTES          => L_FS3_BYTES,
                             FS4_BLOCKS         => L_FS4_BLOCKS,
                             FS4_BYTES          => L_FS4_BYTES,
                             FULL_BLOCKS        => L_FULL_BLOCKS,
                             FULL_BYTES         => L_FULL_BYTES,
                             PARTITION_NAME     => P_PARTITION_NAME);
    
/*      DBMS_OUTPUT.PUT_LINE('');
      DBMS_OUTPUT.PUT_LINE('The segment is analyzed below');
      P('FS1 Blocks (0-25)   ', L_FS1_BLOCKS);
      P('FS2 Blocks (25-50)  ', L_FS2_BLOCKS);
      P('FS3 Blocks (50-75)  ', L_FS3_BLOCKS);
      P('FS4 Blocks (75-100) ', L_FS4_BLOCKS);
      P('Unformatted Blocks  ', L_UNFORMATTED_BLOCKS);
      P('Full Blocks         ', L_FULL_BLOCKS);*/
      INSERT INTO SCOTT.SHOW_SPACE_TABLE_REPORT
        (TABLE_NAME,
         TOTAL_BLOCKS,
         TOTAL_BYTES,
         TOTAL_MBYTES,
         UNUSED_BLOCKS,
         UNUSED_BYTES,
         UNUSED_KBYTES,
         USED_BLOCKS,
         USED_BYTES,
         USED_KBYTES,
         LAST_USED_EXT_FILEID,
         LAST_USED_EXT_BLOCKID,
         LAST_USED_BLOCK,
         FS1_BLOCKS_0_25,
         FS2_BLOCKS_25_50,
         FS3_BLOCKS_50_75,
         FS4_BLOCKS_75_100,
         UNFORMATTED_BLOCKS,
         FULL_BLOCKS)
      VALUES
        (P_SEGMENT_NAME,
         L_TOTAL_BLOCKS,
         L_TOTAL_BYTES,
         L_TOTAL_BYTES / 1024 / 1024,
         L_UNUSED_BLOCKS,
         L_UNUSED_BYTES,
         L_UNUSED_BYTES / 1024,
         L_TOTAL_BLOCKS - L_UNUSED_BLOCKS,
         L_TOTAL_BYTES - L_UNUSED_BYTES,
         (L_TOTAL_BYTES - L_UNUSED_BYTES) / 1024,
         L_LASTUSEDEXTFILEID,
         L_LASTUSEDEXTBLOCKID,
         L_LAST_USED_BLOCK,
         L_FS1_BLOCKS,
         L_FS2_BLOCKS,
         L_FS3_BLOCKS,
         L_FS4_BLOCKS,
         L_UNFORMATTED_BLOCKS,
         L_FULL_BLOCKS);
      COMMIT;
    ELSE
      DBMS_SPACE.FREE_BLOCKS(SEGMENT_OWNER     => P_SEGMENT_OWNER,
                             SEGMENT_NAME      => P_SEGMENT_NAME,
                             SEGMENT_TYPE      => P_SEGMENT_TYPE,
                             FREELIST_GROUP_ID => 0,
                             FREE_BLKS         => L_FREE_BLKS);
      /*P('Free Blocks', L_FREE_BLKS);*/
      INSERT INTO SCOTT.SHOW_SPACE_TABLE_REPORT
        (TABLE_NAME,
         TOTAL_BLOCKS,
         TOTAL_BYTES,
         TOTAL_MBYTES,
         UNUSED_BLOCKS,
         UNUSED_BYTES,
         UNUSED_KBYTES,
         USED_BLOCKS,
         USED_BYTES,
         USED_KBYTES,
         LAST_USED_EXT_FILEID,
         LAST_USED_EXT_BLOCKID,
         LAST_USED_BLOCK,
         FS1_BLOCKS_0_25,
         FS2_BLOCKS_25_50,
         FS3_BLOCKS_50_75,
         FS4_BLOCKS_75_100,
         UNFORMATTED_BLOCKS,
         FULL_BLOCKS,
         FREE_BLKS)
      VALUES
        (P_SEGMENT_NAME,
         L_TOTAL_BLOCKS,
         L_TOTAL_BYTES,
         L_TOTAL_BYTES / 1024 / 1024,
         L_UNUSED_BLOCKS,
         L_UNUSED_BYTES,
         L_UNUSED_BYTES / 1024,
         L_TOTAL_BLOCKS - L_UNUSED_BLOCKS,
         L_TOTAL_BYTES - L_UNUSED_BYTES,
         (L_TOTAL_BYTES - L_UNUSED_BYTES) / 1024,
         L_LASTUSEDEXTFILEID,
         L_LASTUSEDEXTBLOCKID,
         L_LAST_USED_BLOCK,
         L_FS1_BLOCKS,
         L_FS2_BLOCKS,
         L_FS3_BLOCKS,
         L_FS4_BLOCKS,
         L_UNFORMATTED_BLOCKS,
         L_FULL_BLOCKS,
         L_FREE_BLKS);
      COMMIT;
    END IF;
  END IF;
END;

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28340999/viewspace-1767394/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-03-12

  • 博文量
    8
  • 访问量
    31796