Las columnas computadas son columnas donde no se introducen datos, sino que su contenido es obtenido después de realizar algunas operaciones en otras columnas.

https://firebird21.wordpress.com/2013/06/23/columnas-computadas/

Por ejemplo, tenemos una columna para guardar los APELLIDOS de una persona, otra columna para guardar los NOMBRES de esa persona y creamos una columna computada para tener en ella los APELLIDOS y los NOMBRES. Algo como esto:

ALU_APENOM COMPUTED BY (TRIM(ALU_APELLD) || ', ' || ALU_NOMBRE)

Los usuarios introducen datos en las columnas ALU_APELLD (apellidos del alumno) y ALU_NOMBRE (nombres del alumno) pero no en la columna ALU_APENOM (apellidos y nombres del alumno). ¿Por qué no en esa columna? porque esa es una columna computada como podemos ver en la definición, ya que el nombre de la columna está seguido por COMPUTED BY. En el ejemplo anterior las columnas ALU_APELLD y ALU_NOMBRE pertenecen a la misma tabla que la columna ALU_APENOM. ¿Pero y si queremos columnas de otra tabla, es posible conseguir eso?

Sí, es posible.

Para ello debemos:

  1. Crear un stored procedure seleccionable
  2. Usar doble paréntesis, rodeando al SELECT que nos traerá los datos que queremos.

Ejemplo:

Supongamos que tenemos una tabla llamada EMPLEADOS y otra tabla llamada SALARIOS y deseamos que la tabla EMPLEADOS tenga una columna computada que contendrá el total de los salarios pagados a cada empleado.

CREATE PROCEDURE TOTAL_PAGADO(
   tnIdeEmp INTEGER)
RETURNS(
   ftnPagado INTEGER)
AS
BEGIN

   ftnPagado = (SELECT SUM(SAL_MONTOX) FROM SALARIOS WHERE SAL_IDEEMP = :tnIdeEmp);

   SUSPEND;

END;

Este stored procedure seleccionable (sabemos que es seleccionable porque tiene el comando SUSPEND en él) halla y devuelve la suma de todos los salarios pagados a cada empleado. Recibe como parámetro de entrada el identificador del empleado que nos interesa y devuelve la suma de los salarios que se le pagaron. Recuerda que el stored procedure debe ser seleccionable para que esta técnica funcione.

CREATE TABLE EMPLEADOS (
   EMP_IDENTI BIGINT NOT NULL,
   EMP_NOMBRE VARCHAR(20),
   EMP_APELLD VARCHAR(20),
   EMP_PAGADO COMPUTED BY ((SELECT FTNPAGADO FROM TOTAL_PAGADO(EMP_IDENTI))));

En la columna computada EMP_PAGADO el SELECT debe estar rodeado por dos paréntesis. Si pones un solo paréntesis el Firebird se enojará contigo y te dirá que cometiste un error. Debes usar dobles paréntesis.

 Luego, escribiendo un comando tal como:

SELECT
   *
FROM
   EMPLEADOS

Esto será lo que obtendremos:

COMPUTED1

Captura 1. Si haces clic en la imagen la verás más grande

Que es exactamente lo que queríamos obtener. Los datos de cada empleado y el total de los salarios que le hemos pagado hasta este momento.

Desde luego que podríamos haber obtenido estos mismos datos sin necesidad de usar columnas computadas, el hecho de usar columnas computadas tiene la ventaja de que nuestros SELECTs son más sencillos de escribir. Fíjate en el SELECT que nos mostró la Captura 1., si no las hubiéramos usado ese SELECT hubiera sido más complicado de escribir. Aquí simplemente escribimos: SELECT * FROM EMPLEADOS y ya obtuvimos lo que queríamos.

NOTA IMPORTANTE:

Esta técnica debe solamente ser empleada con versiones de Firebird 2.1 ó posteriores, ya que las versiones anteriores tenían un problema que causaba que los backups no pudieran ser restaurados. Así que si estás usando Firebird 1.0 ó Firebird 1.5 ó Firebird 2.0, ni se te ocurra utilizar esta técnica.

Y aunque estés usando Firebird 2.1 ó posterior siempre es recomendable que hagas un backup y lo restaures inmediatamente, para verificar de que tu backup puede ser restaurado exitosamente.

Conclusión:

Usar el comando SELECT dentro de una columna computada es una técnica de programación que nos facilitará escribir futuros SELECTs. Para que esta técnica funcione debemos hacer dos cosas:

  1. Escribir un stored procedure seleccionable
  2. Rodear con doble paréntesis a la columna COMPUTED BY

Artículos relacionados:

Columnas computadas

El índice del blog Firebird21

El foro del blog Firebird21

Anuncios