OK, I'll post it.  Salt to taste or toss it in the garbage.  Note that this
is just collecting data and doesn't make any recommendations or such.
Comments and critiques welcome, except from Mladen...  (running for cover)
;)

And, of course, standard disclaimers apply!


Rich

Rich Jesse                           System/Database Administrator
[EMAIL PROTECTED]                  Quad/Tech Inc, Sussex, WI USA

--


CREATE TABLE TS_ACTIVITY
(
  TABLESPACE_NAME  VARCHAR2(30),
  FREE_SPACE       NUMBER,
  USED_SPACE       NUMBER,
  MAX_FREE_SPACE   NUMBER,
  TIMESTAMP        DATE
)
TABLESPACE USERS
/

COMMENT ON TABLE TS_ACTIVITY IS 'Tablespace Activity: Records changes in
physical attributes of all permanent, dictionary-managed tablespaces.'
/

CREATE INDEX TS_ACTIVITY_TS_NAME ON TS_ACTIVITY
(TABLESPACE_NAME)
TABLESPACE USERS
/


CREATE OR REPLACE PROCEDURE TS_CHECK IS
--
-- Explicit SELECT access must be granted to this schema on the following
SYS views:
--
--      DBA_TABLESPACES
--      DBA_DATA_FILES
--      DBA_FREE_SPACE
--
-- Modification History
-- ---------------------------------------------------------------------
-- 12/19/2001   REJ             Created.

v_tablespace_name               ts_activity.tablespace_name%TYPE;
v_free_space                    ts_activity.free_space%TYPE;
v_used_space                    ts_activity.used_space%TYPE;
v_max_free_space                ts_activity.max_free_space%TYPE;
v_rowcount                      NUMBER;

CURSOR C_TS IS
        SELECT d.tablespace_name, f.bytes "FREE_SPACE",
                NVL(a.bytes - NVL(f.bytes, 0), 0) "USED_SPACE",
                f.max_free_space
        FROM sys.dba_tablespaces d,
                (SELECT tablespace_name, SUM(bytes) bytes
                FROM dba_data_files
                GROUP BY tablespace_name) a,
                (SELECT tablespace_name, SUM(bytes) bytes, MAX(bytes)
max_free_space
                FROM dba_free_space
                GROUP BY tablespace_name) f
                WHERE d.tablespace_name = a.tablespace_name(+) AND
d.tablespace_name = f.tablespace_name(+)
                        AND d.contents = 'PERMANENT';

BEGIN

FOR tsrec IN C_TS LOOP

        SELECT COUNT(*)
                INTO v_rowcount
        FROM ts_activity
        WHERE tablespace_name = tsrec.tablespace_name;

        IF v_rowcount > 0 THEN
                SELECT q.tablespace_name, q.free_space, q.used_space,
q.max_free_space
                        INTO v_tablespace_name, v_free_space, v_used_space,
v_max_free_space
                FROM
                        ts_activity q,
                        (SELECT MAX(timestamp) timestamp
                        FROM ts_activity
                        WHERE tablespace_name = tsrec.tablespace_name) ts
                WHERE q.tablespace_name = tsrec.tablespace_name
                        AND q.timestamp = ts.timestamp;
        END IF;

        IF tsrec.free_space != v_free_space
        OR tsrec.used_space != v_used_space
        OR tsrec.max_free_space != v_max_free_space
        OR v_rowcount = 0 THEN
                INSERT INTO ts_activity
                        (tablespace_name, free_space, used_space,
max_free_space, timestamp)
                        VALUES (tsrec.tablespace_name, tsrec.free_space,
tsrec.used_space, tsrec.max_free_space, SYSDATE);
        END IF;
END LOOP;

END TS_CHECK;
/


-----Original Message-----
Sent: Monday, August 11, 2003 5:29 PM
To: Multiple recipients of list ORACLE-L


Rich, 
I'd love to see the procedure and table that you use.  Thanks for offering. 


Best regards, 
David B. Wagoner 
Database Administrator 
Arsenal Digital Solutions 
-- 
Please see the official ORACLE-L FAQ: http://www.orafaq.net
-- 
Author: Jesse, Rich
  INET: [EMAIL PROTECTED]

Fat City Network Services    -- 858-538-5051 http://www.fatcity.com
San Diego, California        -- Mailing list and web hosting services
---------------------------------------------------------------------
To REMOVE yourself from this mailing list, send an E-Mail message
to: [EMAIL PROTECTED] (note EXACT spelling of 'ListGuru') and in
the message BODY, include a line containing: UNSUB ORACLE-L
(or the name of mailing list you want to be removed from).  You may
also send the HELP command for other information (like subscribing).

Reply via email to