En una Base de Datos puedes tener muchas columnas de tipo BLOB (Binary Large OBject) y usarlas para guardar en ellas textos largos, fotografías, canciones, vídeos, etc.

Esto está muy bien y para eso se usan. Pero supongamos que ahora te interesa conocer el tamaño total en bytes que todas esas columnas de tipo BLOB ocupan en tu Base de Datos. ¿Cómo puedes tener esa información?

El siguiente stored procedure te lo dirá.

Listado 1.

CREATE PROCEDURE TAMANO_BLOBS
   RETURNS(
      ftnTamanoTotal BIGINT)
AS
   DECLARE VARIABLE lcNombreTabla   CHAR(31);
   DECLARE VARIABLE lcNombreColumna CHAR(31);
   DECLARE VARIABLE lcComando       VARCHAR(1024);
   DECLARE VARIABLE lnTamanoBlob    BIGINT;
BEGIN

   ftnTamanoTotal = 0;

   FOR SELECT
      R.RDB$RELATION_NAME,
      R.RDB$FIELD_NAME
   FROM
      RDB$RELATION_FIELDS R
   JOIN
      RDB$FIELDS F
         ON R.RDB$FIELD_SOURCE = F.RDB$FIELD_NAME
   WHERE
      F.RDB$FIELD_TYPE = 261
   INTO
      :lcNombreTabla,
      :lcNombreColumna
   DO BEGIN
      lcComando = 'SELECT 
                      SUM(OCTET_LENGTH(' || :lcNombreColumna || ')) 
                   FROM ' || 
                     :lcNombreTabla || '
                   WHERE 
                      NOT ' || :lcNombreColumna || ' IS NULL ' ;
      EXECUTE STATEMENT (:lcComando ) INTO :lnTamanoBLOB;
      ftnTamanoTotal = ftnTamanoTotal + Coalesce(lnTamanoBLOB, 0);
   END

END;

Explicación:

El FOR SELECT obtiene el nombre de todas las tablas que tienen al menos una columna cuyo tipo de campo es 261 (es decir, BLOB) y además obtiene el nombre de esa/s columna/s.

El EXECUTE STATEMENT obtiene el tamaño en bytes de cada una de esas columnas de tipo BLOB.

Luego, simplemente se acumulan esos tamaños en la variable de salida ftnTamanoTotal.

El tamaño en bytes de una sola columna de una tabla

¿Y si te interesa conocer solamente el tamaño en bytes que ocupa una columna de tipo BLOB de una tabla?

Listado 2.

SELECT
   SUM(OCTET_LENGTH(MiColumnaBLOB))
FROM
   MiTabla
WHERE
   MiColumnaBLOB IS NOT NULL

Artículos relacionados:

El índice del blog Firebird21

El foro del blog Firebird21

Anuncios