Show_space/// get_rowid

 

SQL> select dbms_metadata.get_ddl('PROCEDURE','SHOW_SPACE') from dual;

 

DBMS_METADATA.GET_DDL('PROCEDURE','SHOW_SPACE')

--------------------------------------------------------------------------------

 

  CREATE OR REPLACE PROCEDURE "SYS"."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_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 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;

 

 

 

SQL> select dbms_metadata.get_ddl('FUNCTION','GET_ROWID') from dual;

 

DBMS_METADATA.GET_DDL('FUNCTION','GET_ROWID')

--------------------------------------------------------------------------------

 

  CREATE OR REPLACE FUNCTION "SYS"."GET_ROWID"

(l_rowid in varchar2)

return varchar2

is

ls_my_rowid  varchar2(200);

rowid_type  number;

object_number  number;

relative_fno  number;

block_number  number;

row_number  number;

begin

 dbms_rowid.rowid_info(l_rowid,rowid_type,object_number,relative_fno, block_numb

er, row_number);

 ls_my_rowid := 'Object# is      :'||to_char(object_number)||chr(10)||

  'Relative_fno is :'||to_char(relative_fno)||chr(10)||

  'Block number is :'||to_char(block_number)||chr(10)||

  'Row number is   :'||to_char(row_number);

 return ls_my_rowid ;

end;

创建时间:2022-03-30 21:08
浏览量:0