Hello all,

I have attached an sql file containing a set of sql's (6) of them, which gives me 
information regarding table fragmentation. What I need to do is instead of writing 
seperate sql's, I need to write a procedure, where in I pass the owner and table name 
and then the result comes out, as you will see in the last sql.

What I need is, if some one could please help in writing a procedure? How to put 
cursors and use all the information in different cursor variables etc.

Please help.

Thanks.

Rgds,

Raja



Accept owner prompt 'Enter Owner Name ' 
Accept tnm prompt 'Enter Table Name ' 

set echo off verify off heading off
set termout off

col val4 new_val hwm_blocks noprint
col val5 new_val above_hwm noprint
col val6 new_val row_chains noprint
col val7 new_val row_size noprint
col val7a new_val pct_used noprint
col val7b new_val pct_free noprint
col val8 new_val num_rows noprint
col val9 new_val row_chains_pct noprint

select  num_rows        val8,
        blocks          val4,
        empty_blocks    val5,
        chain_cnt       val6,
        avg_row_len     val7,
        pct_used        val7a,
        pct_free        val7b,
        100*chain_cnt/num_rows val9
from    dba_tables
where   table_name = upper('&tnm')
  and   owner      = upper('&owner');

col val9 new_val block_size noprint
select value val9
from   v$parameter
where  name = 'db_block_size';
col val10a new_val blocks_alloc noprint
col val10b new_val bytes_alloc noprint
col val10e new_val hwm_bytes noprint
col val10f new_val bytes_used noprint

select &hwm_blocks+&above_hwm val10a,
       (&hwm_blocks+&above_hwm)*&block_size/1024/1024 val10b,
       (&hwm_blocks*&block_size)/1024/1024 val10e,
       (&num_rows*&row_size)/1024/1024 val10f
from   dual;

col val11a new_val blocks_pct_used noprint
col val11b new_val bytes_pct_used noprint
select 100*&hwm_blocks/&blocks_alloc val11a,
       100*&num_rows*&row_size/&hwm_bytes/1024/1024 val11b
from   dual;

col val12 new_val sf noprint
select  count(*) val12
from    dba_extents
where   segment_name= upper('&tnm')
  and   owner       = upper('&owner');


set termout on
set echo off feedback off verify off

col bogus         format 999,999,999         fold_after


select 'Owner              : '||'&owner' bogus,
       'Table name         : '||'&tnm' bogus,
       'pct_free           : '||&pct_free bogus,
       'pct_used           : '||&pct_used bogus,
       'Number of extents  : '||&sf||' <-- Segment Fragmentation' bogus,
       'Rows               : '||&num_rows bogus,
       'Row size           : '||&row_size bogus,
       'Rows frag:migration: '||&row_chains bogus,
       'Row % frag:migr.   : '||&row_chains_pct||'% <-- Row Fragmentation' bogus,
       'DB block size      : '||&block_size bogus,
       'Blocks alloc       : '||&blocks_alloc bogus,
       'Block HWM          : '||&hwm_blocks bogus,
       '% alloc used by HWM: '||&blocks_pct_used||'%' bogus,
       'MB alloc           : '||&bytes_alloc||'MB' bogus,
       'MB HWM             : '||&hwm_bytes||'MB' bogus,
       'MB used            : '||&bytes_used||'MB' bogus,
       '% HWM bytes used   : '||&bytes_pct_used||'% <-- Block Fragmentation' bogus
from   dual;

prompt *** The table &owner..&tnm must have been recently analyzed for accuracy
prompt *** You may need to ANALYZE TABLE &owner..&tnm DELETE STATISTICS

set echo on verify on heading on feedback on

Reply via email to