Tablespace Usage Report Procedure

Procedure Code

--
-- Tablespace Usage Procedure
--

CREATE OR REPLACE PROCEDURE tspuse
   ( t_threshold IN NUMBER := 80 ) AS
   c_newline       CHAR(1)      := CHR( 10 );
   c_horzline      CHAR(80)     := '+'||LPAD( '-', 78, '-' )||'+';
   c_vertline      CHAR(80)     := '|'|| LPAD( '|', 79 );
   t_date          DATE;
   t_dbname        VARCHAR2(10);
   t_tablespace    VARCHAR2(30);
   t_percentage    NUMBER       := 0;
   t_usedbytes     NUMBER(10,3) := 0;
   t_availbytes    NUMBER(10,3) := 0;
   t_availtotal    NUMBER(10,3) := 0;
   t_usedtotal     NUMBER(10,3) := 0;
   CURSOR t_usage_cur IS
      SELECT ddf.tablespace_name,
             SUM( distinct ddf.ddfbytes ) / 1048576 ambytecount,
             SUM( NVL( ds.dsbytes , 0 ) / 1048576 ) umbytecount
      FROM
         ( SELECT tablespace_name, SUM( bytes ) ddfbytes
           FROM sys.dba_data_files
           GROUP BY tablespace_name
           UNION
           SELECT tablespace_name, SUM( bytes )
           FROM sys.dba_temp_files
           GROUP BY tablespace_name ) ddf,
         ( SELECT tablespace_name, SUM( bytes ) dsbytes
           FROM sys.dba_segments
           GROUP BY tablespace_name
           UNION
           SELECT tablespace_name, SUM( bytes_used )
           FROM v$temp_space_header
           GROUP BY tablespace_name ) ds
      WHERE ddf.tablespace_name = ds.tablespace_name (+)
      GROUP BY ddf.tablespace_name;
BEGIN
   SELECT name
      INTO t_dbname
      FROM v$database;
   t_date := sysdate;
   DBMS_OUTPUT.put_line ( c_newline );
   DBMS_OUTPUT.put_line ( c_horzline );
   DBMS_OUTPUT.put_line ( c_vertline );
   DBMS_OUTPUT.put ( '|   Date : ' || INITCAP(SUBSTR(TO_CHAR( t_date, 'DAY' ), 1, 3 ) ) || ' ' || INITCAP(TO_CHAR( t_date, 'DD MON YYYY' ) ) || LPAD( ' ', 35 ) || 'Time : ' || TO_CHAR( t_date, 'HH24:MI:SS' ) || '   |' );
   DBMS_OUTPUT.new_line;
   DBMS_OUTPUT.put_line ( c_vertline );
   DBMS_OUTPUT.put_line ( c_vertline );
   DBMS_OUTPUT.put ( '|              TABLESPACE USAGE REPORT FOR DATABASE :  ' || LPAD( t_dbname, 10 ) || '              |' );
   DBMS_OUTPUT.new_line;
   DBMS_OUTPUT.put ( '|             ' ||  LPAD( '=', 52, '=' ) || '|' );
   DBMS_OUTPUT.new_line;
   DBMS_OUTPUT.put_line ( c_vertline );
   DBMS_OUTPUT.put_line ( c_horzline );
   DBMS_OUTPUT.put_line ( c_vertline );
   DBMS_OUTPUT.put ( '|         TABLESPACE NAME             AVAILABLE        USED       %age   >' || SUBSTR( TO_CHAR(t_threshold, '90' ), -2 ) || '%  |' );
   DBMS_OUTPUT.new_line;
   DBMS_OUTPUT.put ( '|                                     Megabytes      Megabytes    FULL   FULL  |' );
   DBMS_OUTPUT.new_line;
   DBMS_OUTPUT.put_line ( c_vertline );
   DBMS_OUTPUT.put_line ( c_horzline );
   DBMS_OUTPUT.put_line ( c_vertline );
   FOR usage_rec IN t_usage_cur LOOP
      t_tablespace := usage_rec.tablespace_name;
      t_availbytes := ROUND( usage_rec.ambytecount, 3 );
      t_usedbytes  := ROUND( usage_rec.umbytecount, 3 );
      t_availtotal := t_availtotal + t_availbytes;
      t_usedtotal  := t_usedtotal + t_usedbytes;
      t_percentage := ROUND ( ( t_usedbytes / t_availbytes ) * 100, 3 );
      DBMS_OUTPUT.put ( '| ' || RPAD( t_tablespace, 30, '.' ) || '.  ' || TO_CHAR( t_availbytes, '999,990.999' ) || ' ..' || TO_CHAR(t_usedbytes, '999,990.999' ) ||  ' ..' || TO_CHAR( t_percentage, '990' ) || '%  ' );
      IF ( t_usedbytes / t_availbytes ) * 100 >= t_threshold THEN
         DBMS_OUTPUT.put ( '*CHECK*|' );
      ELSE
         DBMS_OUTPUT.put ( '       |' );
      END IF;
      DBMS_OUTPUT.new_line;
   END LOOP;
   DBMS_OUTPUT.put_line ( c_vertline );
   DBMS_OUTPUT.put_line ( c_horzline );
   DBMS_OUTPUT.put_line ( c_vertline );
   DBMS_OUTPUT.put ( '|            TOTALS                ' || TO_CHAR( t_availtotal, '999,990.999' ) || '   ' || TO_CHAR(t_usedtotal, '999,990.999' ) || '            |' );
   DBMS_OUTPUT.new_line;
   DBMS_OUTPUT.put_line ( c_vertline );
   DBMS_OUTPUT.put_line ( c_horzline );
   DBMS_OUTPUT.put_line ( c_newline );
END;
/

GRANT execute ON tspuse TO PUBLIC
/

GRANT SELECT ON sys.dba_data_files to PUBLIC
/

GRANT SELECT ON sys.dba_segments to PUBLIC
/

GRANT SELECT ON sys.v_$database to PUBLIC
/

GRANT SELECT ON sys.dba_temp_files to PUBLIC
/

GRANT SELECT ON sys.v_$temp_space_header to PUBLIC
/

DROP PUBLIC SYNONYM tspuse
/

CREATE PUBLIC SYNONYM tspuse FOR tspuse
/

Procedure Call Code

--
-- Tablespace Usage Procedure Call
--

SET FEEDBACK OFF;

SET SERVEROUTPUT ON SIZE 20000;

EXEC TSPUSE (80);

SET FEEDBACK ON;

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License