Anuncios en tutorial de programación PLSQL

lunes, 24 de junio de 2024

Utilidad del paquete estándar PL/SQL DBMS_ROWID

Hace unas semanas me llegó una consulta sobre PL/SQL en la que se me preguntaba si era posible conocer, utilizando una consulta SQL, el nombre de la partición en la que se encontraba almacenado un determinado registro de una tabla. El paquete estándar PLSQL DBMS_ROWID nos puede ayudar a obtener esta información mediante la extracción del ROWID_OBJECT que identifica de manera única el segmento donde se encuentran los datos. Después bastará que asociemos este identificador con una de las vistas XXX_OBJECTS (donde XXX puede ser DBA, ALL o USER) para obtener el nombre de la partición (ver ejemplo a continuación).

Subprogramas del paquete estándar PL/SQL DBMS_ROWID
SELECT sh.order_number
     , do.subobject_name
     , do.data_object_id
  FROM oe.so_headers_all sh
     , dba_objects do
 WHERE do.data_object_id = 
       DBMS_ROWID.ROWID_OBJECT(sh.rowid)
   AND sh.order_number = '123456'

ORDER_NUMBER SUBOBJECT_NAME DATA_OBJECT_ID
------------ -------------- --------------
123456       PART1          15107         

El paquete estándar PLSQL DBMS_ROWID resulta de mucha utilidad para ver como los datos están organizados dentro de una tabla e identificar donde están almacenados los distintos registros de la misma. Veamos a continuación otro ejemplo de uso del paquete DBMS_ROWID.

SELECT sh.order_number
     , dt.tablespace_name
     , dt.status
  FROM oe.so_headers_all sh
     , dba_data_files  ddf
     , dba_tablespaces dt
WHERE  ddf.tablespace_name = dt.tablespace_name
  AND ddf.relative_fno = 
      DBMS_ROWID.ROWID_RELATIVE_FNO(sh.rowid)
  AND ddf.file_id = 
      DBMS_ROWID.ROWID_TO_ABSOLUTE_FNO
      (sh.rowid, 'OE', 'SO_HEADERS_ALL')
  AND sh.order_number = '123456'

ORDER_NUMBER TABLESPACE_NAME STATUS   
------------ --------------- ---------
123456       RESDATOS        ONLINE   

En este caso hemos utilizado el paquete estándar PL/SQL DBMS_ROWID para obtener, para un determinado ROWID, el número de bloque y el número de fichero en la base de datos Oracle, con estos valores podremos consultar en la vista DBA_DATA_FILES el nombre del TABLESPACE en el que está almacenado el registro en cuestión y después, utilizando la vista DBA_TABLESPACES, podremos determinar el estado de dicho TABLESPACE.

0 comentarios: