Anuncios en tutorial de programación PLSQL

lunes, 1 de abril de 2019

Utilidad del paquete estándar PL/SQL DBMS_ROWID

Un chiste y la utilidad del paquete estándar PL/SQL DBMS_ROWIDHace 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).

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: