CREATE OR REPLACE PROCEDURE SHOW_SPACE_TABLE(V_SEGMENT_NAME IN VARCHAR2,
V_SEGMENT_OWNER IN VARCHAR2 DEFAULT USER,
V_SEGMENT_TYPE IN VARCHAR2 DEFAULT 'TABLE',
P_ANALYZED IN VARCHAR2 DEFAULT 'Y',
P_PARTITION_NAME IN VARCHAR2 DEFAULT NULL) AS
P_SEGMENT_NAME VARCHAR2(30);
P_SEGMENT_OWNER VARCHAR2(30);
P_SEGMENT_TYPE VARCHAR2(30);
P_SPACE VARCHAR2(30);
L_UNFORMATTED_BLOCKS NUMBER;
L_UNFORMATTED_BYTES NUMBER;
L_FS1_BLOCKS NUMBER;
L_FS1_BYTES NUMBER;
L_FS2_BLOCKS NUMBER;
L_FS2_BYTES NUMBER;
L_FS3_BLOCKS NUMBER;
L_FS3_BYTES NUMBER;
L_FS4_BLOCKS NUMBER;
L_FS4_BYTES NUMBER;
L_FULL_BLOCKS NUMBER;
L_FULL_BYTES NUMBER;
L_FREE_BLKS NUMBER;
L_TOTAL_BLOCKS NUMBER;
L_TOTAL_BYTES NUMBER;
L_UNUSED_BLOCKS NUMBER;
L_UNUSED_BYTES NUMBER;
L_LASTUSEDEXTFILEID NUMBER;
L_LASTUSEDEXTBLOCKID NUMBER;
L_LAST_USED_BLOCK NUMBER;
PROCEDURE P(P_LABEL IN VARCHAR2, P_NUM IN NUMBER) IS
BEGIN
DBMS_OUTPUT.PUT_LINE(RPAD(P_LABEL, 40, '.') || P_NUM);
END;
BEGIN
P_SEGMENT_NAME := UPPER(V_SEGMENT_NAME);
P_SEGMENT_OWNER := UPPER(V_SEGMENT_OWNER);
P_SEGMENT_TYPE := UPPER(V_SEGMENT_TYPE);
IF (P_SEGMENT_TYPE = 'I' OR P_SEGMENT_TYPE = 'INDEX') THEN
P_SEGMENT_TYPE := 'INDEX';
ELSIF (P_SEGMENT_TYPE = 'T' OR P_SEGMENT_TYPE = 'TABLE') THEN
P_SEGMENT_TYPE := 'TABLE';
ELSIF (P_SEGMENT_TYPE = 'C' OR P_SEGMENT_TYPE = 'CLUSTER') THEN
P_SEGMENT_TYPE := 'CLUSTER';
END IF;
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'
INTO P_SPACE
USING P_SEGMENT_NAME, P_PARTITION_NAME, P_PARTITION_NAME, P_SEGMENT_OWNER;
DBMS_SPACE.UNUSED_SPACE(SEGMENT_OWNER => P_SEGMENT_OWNER,
SEGMENT_NAME => P_SEGMENT_NAME,
SEGMENT_TYPE => P_SEGMENT_TYPE,
TOTAL_BLOCKS => L_TOTAL_BLOCKS,
TOTAL_BYTES => L_TOTAL_BYTES,
UNUSED_BLOCKS => L_UNUSED_BLOCKS,
UNUSED_BYTES => L_UNUSED_BYTES,
LAST_USED_EXTENT_FILE_ID => L_LASTUSEDEXTFILEID,
LAST_USED_EXTENT_BLOCK_ID => L_LASTUSEDEXTBLOCKID,
LAST_USED_BLOCK => L_LAST_USED_BLOCK,
PARTITION_NAME => P_PARTITION_NAME);
/* P('Total Blocks ', L_TOTAL_BLOCKS);
P('Total Bytes ', L_TOTAL_BYTES);
P('Total MBytes ', L_TOTAL_BYTES / 1024 / 1024);
P('Unused Blocks ', L_UNUSED_BLOCKS);
P('Unused Bytes ', L_UNUSED_BYTES);
P('Unused KBytes ', L_UNUSED_BYTES / 1024);
P('Used Blocks ', L_TOTAL_BLOCKS - L_UNUSED_BLOCKS);
P('Used Bytes ', L_TOTAL_BYTES - L_UNUSED_BYTES);
P('Used KBytes ', (L_TOTAL_BYTES - L_UNUSED_BYTES) / 1024);
P('Last Used Ext FileId', L_LASTUSEDEXTFILEID);
P('Last Used Ext BlockId', L_LASTUSEDEXTBLOCKID);
P('Last Used Block', L_LAST_USED_BLOCK);*/
IF P_ANALYZED = 'Y' THEN
IF P_SPACE = 'AUTO' THEN
DBMS_SPACE.SPACE_USAGE(SEGMENT_OWNER => P_SEGMENT_OWNER,
SEGMENT_NAME => P_SEGMENT_NAME,
SEGMENT_TYPE => P_SEGMENT_TYPE,
UNFORMATTED_BLOCKS => L_UNFORMATTED_BLOCKS,
UNFORMATTED_BYTES => L_UNFORMATTED_BYTES,
FS1_BLOCKS => L_FS1_BLOCKS,
FS1_BYTES => L_FS1_BYTES,
FS2_BLOCKS => L_FS2_BLOCKS,
FS2_BYTES => L_FS2_BYTES,
FS3_BLOCKS => L_FS3_BLOCKS,
FS3_BYTES => L_FS3_BYTES,
FS4_BLOCKS => L_FS4_BLOCKS,
FS4_BYTES => L_FS4_BYTES,
FULL_BLOCKS => L_FULL_BLOCKS,
FULL_BYTES => L_FULL_BYTES,
PARTITION_NAME => P_PARTITION_NAME);
/* DBMS_OUTPUT.PUT_LINE('');
DBMS_OUTPUT.PUT_LINE('The segment is analyzed below');
P('FS1 Blocks (0-25) ', L_FS1_BLOCKS);
P('FS2 Blocks (25-50) ', L_FS2_BLOCKS);
P('FS3 Blocks (50-75) ', L_FS3_BLOCKS);
P('FS4 Blocks (75-100) ', L_FS4_BLOCKS);
P('Unformatted Blocks ', L_UNFORMATTED_BLOCKS);
P('Full Blocks ', L_FULL_BLOCKS);*/
INSERT INTO
SCOTT.SHOW_SPACE_TABLE_REPORT
(TABLE_NAME,
TOTAL_BLOCKS,
TOTAL_BYTES,
TOTAL_MBYTES,
UNUSED_BLOCKS,
UNUSED_BYTES,
UNUSED_KBYTES,
USED_BLOCKS,
USED_BYTES,
USED_KBYTES,
LAST_USED_EXT_FILEID,
LAST_USED_EXT_BLOCKID,
LAST_USED_BLOCK,
FS1_BLOCKS_0_25,
FS2_BLOCKS_25_50,
FS3_BLOCKS_50_75,
FS4_BLOCKS_75_100,
UNFORMATTED_BLOCKS,
FULL_BLOCKS)
VALUES
(P_SEGMENT_NAME,
L_TOTAL_BLOCKS,
L_TOTAL_BYTES,
L_TOTAL_BYTES / 1024 / 1024,
L_UNUSED_BLOCKS,
L_UNUSED_BYTES,
L_UNUSED_BYTES / 1024,
L_TOTAL_BLOCKS - L_UNUSED_BLOCKS,
L_TOTAL_BYTES - L_UNUSED_BYTES,
(L_TOTAL_BYTES - L_UNUSED_BYTES) / 1024,
L_LASTUSEDEXTFILEID,
L_LASTUSEDEXTBLOCKID,
L_LAST_USED_BLOCK,
L_FS1_BLOCKS,
L_FS2_BLOCKS,
L_FS3_BLOCKS,
L_FS4_BLOCKS,
L_UNFORMATTED_BLOCKS,
L_FULL_BLOCKS);
COMMIT;
ELSE
DBMS_SPACE.FREE_BLOCKS(SEGMENT_OWNER => P_SEGMENT_OWNER,
SEGMENT_NAME => P_SEGMENT_NAME,
SEGMENT_TYPE => P_SEGMENT_TYPE,
FREELIST_GROUP_ID => 0,
FREE_BLKS => L_FREE_BLKS);
/*P('Free Blocks', L_FREE_BLKS);*/
INSERT INTO SCOTT.SHOW_SPACE_TABLE_REPORT
(TABLE_NAME,
TOTAL_BLOCKS,
TOTAL_BYTES,
TOTAL_MBYTES,
UNUSED_BLOCKS,
UNUSED_BYTES,
UNUSED_KBYTES,
USED_BLOCKS,
USED_BYTES,
USED_KBYTES,
LAST_USED_EXT_FILEID,
LAST_USED_EXT_BLOCKID,
LAST_USED_BLOCK,
FS1_BLOCKS_0_25,
FS2_BLOCKS_25_50,
FS3_BLOCKS_50_75,
FS4_BLOCKS_75_100,
UNFORMATTED_BLOCKS,
FULL_BLOCKS,
FREE_BLKS)
VALUES
(P_SEGMENT_NAME,
L_TOTAL_BLOCKS,
L_TOTAL_BYTES,
L_TOTAL_BYTES / 1024 / 1024,
L_UNUSED_BLOCKS,
L_UNUSED_BYTES,
L_UNUSED_BYTES / 1024,
L_TOTAL_BLOCKS - L_UNUSED_BLOCKS,
L_TOTAL_BYTES - L_UNUSED_BYTES,
(L_TOTAL_BYTES - L_UNUSED_BYTES) / 1024,
L_LASTUSEDEXTFILEID,
L_LASTUSEDEXTBLOCKID,
L_LAST_USED_BLOCK,
L_FS1_BLOCKS,
L_FS2_BLOCKS,
L_FS3_BLOCKS,
L_FS4_BLOCKS,
L_UNFORMATTED_BLOCKS,
L_FULL_BLOCKS,
L_FREE_BLKS);
COMMIT;
END IF;
END IF;
END;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28340999/viewspace-1767394/
,如需转载,请注明出处,否则将追究法律责任。