ORACLE存储过程show_space完整版

show_space的版本在网络上有不少版本. 今天整理出一个通用的版本, 以后用.
 
create or replace procedure show_space(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);
    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);
    end if;
  end if;
end;

 


 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值