show

mac2022-06-30  106

create or replace procedure SHOW_SPACE(P_SEGNAME   IN VARCHAR2,                                       P_OWNER     IN VARCHAR2 DEFAULT USER,                                       P_TYPE      IN VARCHAR2 DEFAULT 'TABLE',                                       P_PARTITION IN VARCHAR2 DEFAULT NULL)-- THIS PROCEDURE USES AUTHID CURRENT USER SO IT CAN QUERY DBA_*  -- VIEWS USING PRIVILEGES FROM A ROLE AND SO IT CAN BE INSTALLED  -- ONCE PER DATABASE, INSTEAD OF ONCE PER USER WHO WANTED TO USE IT.AUTHID CURRENT_USER AS  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;  L_SEGMENT_SPACE_MGMT VARCHAR2(255);  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;  -- INLINE PROCEDURE TO PRINT OUT NUMBERS NICELY FORMATTED  -- WITH A SIMPLE LABEL.  PROCEDURE P(P_LABEL IN VARCHAR2, P_NUM IN NUMBER) IS  BEGIN    DBMS_OUTPUT.PUT_LINE(RPAD(P_LABEL, 40, '.') ||                         TO_CHAR(P_NUM, '999,999,999,999'));  END;BEGIN  -- THIS QUERY IS EXECUTED DYNAMICALLY IN ORDER TO ALLOW THIS PROCEDURE  -- TO BE CREATED BY A USER WHO HAS ACCESS TO DBA_SEGMENTS/TABLESPACES  -- VIA A ROLE AS IS CUSTOMARY.  -- NOTE: AT RUNTIME, THE INVOKER MUST HAVE ACCESS TO THESE TWO  -- VIEWS!  -- THIS QUERY DETERMINES IF THE OBJECT IS AN ASSM OBJECT OR NOT.  BEGIN    EXECUTE IMMEDIATE 'SELECT TS.SEGMENT_SPACE_MANAGEMENTFROM DBA_SEGMENTS SEG, DBA_TABLESPACES TSWHERE SEG.SEGMENT_NAME = :P_SEGNAMEAND (:P_PARTITION IS NULL ORSEG.PARTITION_NAME = :P_PARTITION)AND SEG.OWNER = :P_OWNERAND SEG.TABLESPACE_NAME = TS.TABLESPACE_NAME'      INTO L_SEGMENT_SPACE_MGMT      USING P_SEGNAME, P_PARTITION, P_PARTITION, P_OWNER;  EXCEPTION    WHEN TOO_MANY_ROWS THEN      DBMS_OUTPUT.PUT_LINE('THIS MUST BE A PARTITIONED TABLE, USE P_PARTITION => ');      RETURN;  END;  -- IF THE OBJECT IS IN AN ASSM TABLESPACE, WE MUST USE THIS API  -- CALL TO GET SPACE INFORMATION; ELSE WE USE THE FREE_BLOCKS  -- API FOR THE USER MANAGED SEGMENTS.  IF L_SEGMENT_SPACE_MGMT = 'AUTO' THEN    DBMS_SPACE.SPACE_USAGE(P_OWNER,                           P_SEGNAME,                           P_TYPE,                           L_UNFORMATTED_BLOCKS,                           L_UNFORMATTED_BYTES,                           L_FS1_BLOCKS,                           L_FS1_BYTES,                           L_FS2_BLOCKS,                           L_FS2_BYTES,                           L_FS3_BLOCKS,                           L_FS3_BYTES,                           L_FS4_BLOCKS,                           L_FS4_BYTES,                           L_FULL_BLOCKS,                           L_FULL_BYTES,                           P_PARTITION);    P('UNFORMATTED BLOCKS ', L_UNFORMATTED_BLOCKS);    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('FULL BLOCKS ', L_FULL_BLOCKS);  ELSE    DBMS_SPACE.FREE_BLOCKS(SEGMENT_OWNER     => P_OWNER,                           SEGMENT_NAME      => P_SEGNAME,                           SEGMENT_TYPE      => P_TYPE,                           FREELIST_GROUP_ID => 0,                           FREE_BLKS         => L_FREE_BLKS);    P('FREE BLOCKS', L_FREE_BLKS);  END IF;  -- AND THEN THE UNUSED SPACE API CALL TO GET THE REST OF THE  -- INFORMATION.  DBMS_SPACE.UNUSED_SPACE(SEGMENT_OWNER             => P_OWNER,                          SEGMENT_NAME              => P_SEGNAME,                          SEGMENT_TYPE              => P_TYPE,                          PARTITION_NAME            => P_PARTITION,                          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);  P('TOTAL BLOCKS', L_TOTAL_BLOCKS);  P('TOTAL BYTES', L_TOTAL_BYTES);  P('TOTAL MBYTES', TRUNC(L_TOTAL_BYTES / 1024 / 1024));  P('UNUSED BLOCKS', L_UNUSED_BLOCKS);  P('UNUSED BYTES', L_UNUSED_BYTES);  P('LAST USED EXT FILEID', L_LASTUSEDEXTFILEID);  P('LAST USED EXT BLOCKID', L_LASTUSEDEXTBLOCKID);  P('LAST USED BLOCK', L_LAST_USED_BLOCK);END;

转载于:https://www.cnblogs.com/iyoume2008/p/4690653.html

最新回复(0)