Oracle存储过程show_space完整版


show_space的版本在网络上有不少版本. 今天整理出一个通用的版本, 以后用.
  1. create or replace procedure show_space(v_segment_name   in varchar2,  
  2.                                        v_segment_owner  in varchar2 default user,  
  3.                                        v_segment_type   in varchar2 default 'TABLE',  
  4.                                        p_analyzed       in varchar2 default 'Y',  
  5.                                        p_partition_name in varchar2 default nullas  
  6.   p_segment_name  varchar2(30);  
  7.   p_segment_owner varchar2(30);  
  8.   p_segment_type  varchar2(30);  
  9.   p_space         varchar2(30);  
  10.   
  11.   l_unformatted_blocks number;  
  12.   l_unformatted_bytes  number;  
  13.   l_fs1_blocks         number;  
  14.   l_fs1_bytes          number;  
  15.   l_fs2_blocks         number;  
  16.   l_fs2_bytes          number;  
  17.   l_fs3_blocks         number;  
  18.   l_fs3_bytes          number;  
  19.   l_fs4_blocks         number;  
  20.   l_fs4_bytes          number;  
  21.   l_full_blocks        number;  
  22.   l_full_bytes         number;  
  23.   
  24.   l_free_blks          number;  
  25.   l_total_blocks       number;  
  26.   l_total_bytes        number;  
  27.   l_unused_blocks      number;  
  28.   l_unused_bytes       number;  
  29.   l_lastusedextfileid  number;  
  30.   l_lastusedextblockid number;  
  31.   l_last_used_block    number;  
  32.   
  33.   procedure p(p_label in varchar2, p_num in number) is  
  34.   begin  
  35.     dbms_output.put_line(rpad(p_label, 40, '.') || p_num);  
  36.   end;  
  37. begin  
  38.   p_segment_name  := upper(v_segment_name);  
  39.   p_segment_owner := upper(v_segment_owner);  
  40.   p_segment_type  := upper(v_segment_type);  
  41.   
  42.   if (p_segment_type = 'I' or p_segment_type = 'INDEX'then  
  43.     p_segment_type := 'INDEX';  
  44.   elsif (p_segment_type = 'T' or p_segment_type = 'TABLE'then  
  45.     p_segment_type := 'TABLE';  
  46.   elsif (p_segment_type = 'C' or p_segment_type = 'CLUSTER'then  
  47.     p_segment_type := 'CLUSTER';  
  48.   end if;  
  49.   
  50.   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'  
  51.     into p_space  
  52.     using p_segment_name, p_partition_name, p_partition_name, p_segment_owner;  
  53.   
  54.   dbms_space.unused_space(segment_owner             => p_segment_owner,  
  55.                           segment_name              => p_segment_name,  
  56.                           segment_type              => p_segment_type,  
  57.                           total_blocks              => l_total_blocks,  
  58.                           total_bytes               => l_total_bytes,  
  59.                           unused_blocks             => l_unused_blocks,  
  60.                           unused_bytes              => l_unused_bytes,  
  61.                           last_used_extent_file_id  => l_lastusedextfileid,  
  62.                           last_used_extent_block_id => l_lastusedextblockid,  
  63.                           last_used_block           => l_last_used_block,  
  64.                           partition_name            => p_partition_name);  
  65.   p('Total Blocks  ', l_total_blocks);  
  66.   p('Total Bytes   ', l_total_bytes);  
  67.   p('Total MBytes  ', l_total_bytes / 1024 / 1024);  
  68.   p('Unused Blocks ', l_unused_blocks);  
  69.   p('Unused Bytes  ', l_unused_bytes);  
  70.   p('Unused KBytes ', l_unused_bytes / 1024);  
  71.   p('Used Blocks   ', l_total_blocks - l_unused_blocks);  
  72.   p('Used Bytes    ', l_total_bytes - l_unused_bytes);  
  73.   p('Used KBytes   ', (l_total_bytes - l_unused_bytes) / 1024);  
  74.   p('Last Used Ext FileId', l_lastusedextfileid);  
  75.   p('Last Used Ext BlockId', l_lastusedextblockid);  
  76.   p('Last Used Block', l_last_used_block);  
  77.   
  78.   if p_analyzed = 'Y' then  
  79.     if p_space = 'AUTO' then  
  80.       dbms_space.space_usage(segment_owner      => p_segment_owner,  
  81.                              segment_name       => p_segment_name,  
  82.                              segment_type       => p_segment_type,  
  83.                              unformatted_blocks => l_unformatted_blocks,  
  84.                              unformatted_bytes  => l_unformatted_bytes,  
  85.                              fs1_blocks         => l_fs1_blocks,  
  86.                              fs1_bytes          => l_fs1_bytes,  
  87.                              fs2_blocks         => l_fs2_blocks,  
  88.                              fs2_bytes          => l_fs2_bytes,  
  89.                              fs3_blocks         => l_fs3_blocks,  
  90.                              fs3_bytes          => l_fs3_bytes,  
  91.                              fs4_blocks         => l_fs4_blocks,  
  92.                              fs4_bytes          => l_fs4_bytes,  
  93.                              full_blocks        => l_full_blocks,  
  94.                              full_bytes         => l_full_bytes,  
  95.                              partition_name     => p_partition_name);  
  96.       
  97.       dbms_output.put_line('');  
  98.       dbms_output.put_line('The segment is analyzed below');  
  99.       p('FS1 Blocks (0-25)   ', l_fs1_blocks);  
  100.       p('FS2 Blocks (25-50)  ', l_fs2_blocks);  
  101.       p('FS3 Blocks (50-75)  ', l_fs3_blocks);  
  102.       p('FS4 Blocks (75-100) ', l_fs4_blocks);  
  103.       p('Unformatted Blocks  ', l_unformatted_blocks);  
  104.       p('Full Blocks         ', l_full_blocks);  
  105.     else  
  106.       dbms_space.free_blocks(segment_owner     => p_segment_owner,  
  107.                              segment_name      => p_segment_name,  
  108.                              segment_type      => p_segment_type,  
  109.                              freelist_group_id => 0,  
  110.                              free_blks         => l_free_blks);  
  111.       p('Free Blocks', l_free_blks);  
  112.     end if;  
  113.   end if;  
  114. end;  

相关内容