Cuando programamos con Firebird, al igual que cuando programamos con cualquier lenguaje de programación podemos usar variables. En el caso de Firebird esas variables pueden ser usadas en los stored procedures y en los triggers.

Tenemos cuatro tipos de variables que podemos usar:

  1. Las variables locales
  2. Las variables del Sistema
  3. Las variables de la Conexión
  4. Las variables de la Transacción

1. Las variables locales

Solamente existen dentro del stored procedure o del trigger que las declaró. Para declarar una variable local se utiliza el comando DECLARE VARIABLE. Veamos algunos ejemplos:

DECLARE VARIABLE lcNombre     VARCHAR(40);
DECLARE VARIALBE lnCantidad   SMALLINT;
DECLARE VARIABLE ldFechaVenta DATE;

 Todas las anteriores son variables locales, pueden ser usadas en cualquier lugar dentro del stored procedure o del trigger que las declaró pero cuando éste termina todas esas variables desaparecen, dejan de existir.

2. Las variables del sistema

Estas son puestas por el propio Firebird y los programadores pueden usarlas pero no cambiarles los valores que tienen puestos. Pueden ser de dos tipos:

a) Variables de contexto en el namespace SYSTEM

b) Variables globales

Las variables de contexto en el namespace SYSTEM se recuperan usando la función RDB$GET_CONTEXT() y enviando como primer parámetro de esa función a la palabra ‘SYSTEM’ y como segundo parámetro el nombre de la variable que nos interesa.

SELECT
   RDB$GET_CONTEXT('SYSTEM', 'DB_NAME')
FROM
   RDB$DATABASE

En este caso se recupera la ruta y el nombre completo de la Base de Datos usando para ello la variable DB_NAME la cual existe en el namespace SYSTEM. Puedes ver cuales son las otras variables de ese namespace en este artículo:

https://firebird21.wordpress.com/2013/04/13/rdbget_context/

SELECT
   CURRENT_USER
FROM
   RDB$DATABASE

En el ejemplo anterior obtuvimos el nombre del usuario actual mediante la variable global CURRENT_USER.

3. Las variables de la Conexión

Estas son variables del programador. O sea que es el programador quien les asigna valores y los recupera después. Sus valores pueden ser escritos y leídos en cualquier stored procedure o en cualquier trigger y en cualquier momento, pero cuando el usuario se desconecta de la Base de Datos todas estas variables desaparecen, dejan de existir.

SELECT
   RDB$SET_CONTEXT('USER_SESSION', 'CANTIDAD_INSERTS', lnCantidadInserts + 1)
FROM
   RDB$DATABASE

Arriba se asignó un valor a una variable de la conexión llamada CANTIDAD_INSERTS, la cual puede ser utilizada en cualquier stored procedure o en cualquier trigger y mantendrá su valor en cada uno de ellos. Podríamos utilizarla para saber cuantos INSERT realizó el usuario y así poder decirle algo como: “Juan, estuviste muy haragán hoy, solamente insertaste 6 filas en las tablas”.

SELECT
   RDB$GET_CONTEXT('USER_SESSION', 'CANTIDAD_INSERTS')
FROM
   RDB$DATABASE

El código de arriba nos permite conocer cual es el valor actual de la variable de la conexión llamada CANTIDAD_INSERTS.

Recuerda que las variables de la conexión pueden ser usadas desde el momento en que el usuario se conectó a la Base de Datos hasta el momento en que se desconectó.

4. Las variables de la Transacción

Estas también son variables del programador. El programador puede escribir en ellas cualquier valor que desee y leer ese valor después. Sus valores pueden ser escritos y leídos en cualquier stored procedure o en cualquier trigger y en cualquier momento, pero cuando termina la transacción todas estas variables desaparecen, dejan de existir.

SELECT
   RDB$SET_CONTEXT('USER_TRANSACTION', 'CANTIDAD_INSERTS', lnCantidadInserts + 1)
FROM
   RDB$DATABASE

En este caso la variable CANTIDAD_INSERTS solamente existe en la transacción actual. Cuando la transacción termina la variable CANTIDAD_INSERTS es eliminada, deja de existir.

O sea que las usaríamos para guardar valores que solamente son relevantes en la transacción actual.

Recuerda que las variables de la transacción pueden ser usadas desde el momento en que se inició la transacción hasta el momento en que se terminó la transacción.

Conclusión:

Cuando programamos siempre necesitamos usar variables, es imposible programar cualquier aplicación no trivial sin usar variables. Con Firebird los alcances de las variables pueden ser:

  • locales
  • del sistema
  • de la conexión
  • de la transacción.

Las variables locales solamente pueden ser usadas dentro del stored procedure o del trigger que las declaró. El programador puede escribirlas y leerlas.

Las variables del sistema pueden ser leídas en cualquier stored procedure o trigger pero sus valores no pueden ser cambiados, ya que son puestos por el propio Firebird, y por lo tanto nunca los programadores pueden cambiarlos.

Las variables de la conexión pueden ser usadas desde el momento que empezó la conexión a la Base de Datos hasta el momento en que esa conexión finalizó, en cualquier stored procedure o trigger. El programador puede escribirlas y leerlas.

Las variables de la transacción pueden ser usadas desde el momento en que empezó la transacción hasta el momento en que finalizó la transacción, en cualquier stored procedure o trigger. El programador puede escribirlas y leerlas.

Artículos relacionados:

RDB$GET_CONTEXT()

RDB$SET_CONTEXT()

El índice del blog Firebird21

 

Anuncios