SET SERVEROUTPUT ON
DECLARE
v_tablespace VARCHAR2(50) := 'USERS'; -- Change this to your tablespace
v_cmd VARCHAR2(1000);
BEGIN
FOR rec IN (
SELECT
df.file_name,
df.file_id,
df.tablespace_name,
df.bytes / 1024 / 1024 AS current_size_mb,
(hwm.highest_block_id * ts.block_size) / 1024 / 1024 AS hwm_mb
FROM
dba_data_files df
JOIN dba_tablespaces ts ON df.tablespace_name = ts.tablespace_name
LEFT JOIN (
SELECT
file_id,
MAX(block_id + blocks) AS highest_block_id
FROM
dba_extents
GROUP BY
file_id
) hwm ON df.file_id = hwm.file_id
WHERE
df.tablespace_name = UPPER(v_tablespace)
)
LOOP
IF rec.hwm_mb IS NOT NULL AND rec.current_size_mb - rec.hwm_mb > 10 THEN
-- Allow 10MB safety margin
v_cmd := 'ALTER DATABASE DATAFILE ''' || rec.file_name || ''' RESIZE ' || FLOOR(rec.hwm_mb + 10) || 'M;';
DBMS_OUTPUT.PUT_LINE(v_cmd);
ELSE
DBMS_OUTPUT.PUT_LINE('-- No reclaimable space in file: ' || rec.file_name);
END IF;
END LOOP;
END;
/





0 comments:
Post a Comment