Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Variables Globales (https://www.clubdelphi.com/foros/showthread.php?t=76535)

Abel Garcia 08-11-2011 05:30:48

Variables Globales
 
Hola a todos he realizado esta misma pregunta solo que años atrás cuando solo había Firebird 1.5.
En ese entonces solo quería poder definir en alguna parte de la base de datos una especie de por así llamarles Etiquetas las cuales pudieran utilizarse en cualquier código o procedimiento almacenado.

Ejemplo:

#define NUM_PI = 3.1415. (Similar a lenguaje C++ solo como Ejemplo)


Después utilizarlos en algún código de algún o todos los procedimientos:

FOR SELECT...
BEGIN
IF(:VARX=NUM_PI)
BEIGN
END
END

Según entendía esto o algo similar se podría utilizar en versiones futuras como la actual 2.5 pero no lo encuentro hasta el momento. Alguien sabe de alguna solución a este tipo de requerimiento.

Por su ayuda muchas gracias.

ecfisa 08-11-2011 12:20:08

Hola Abel.

Hasta donde sé Firebird no contempla variables globales.

Si usas una versión anterior a la 2.0 podés usar UDF's o crearte un procedimiento:
Código SQL [-]
CREATE PROCEDURE NUM_PI RETURNS(PI DOUBLE PRECISION) 
AS
BEGIN
  PI = 3.141592654;
END

A partir de la versión 2.0 tenes la opción de usar RDB$SET_CONTEXT y RDB$GET_CONTEXT:
Código SQL [-]
CREATE PROCEDURE NUM_PI
AS
BEGIN
  RDB$SET_CONTEXT('USER_TRANSACTION', 'NUM_PI', 3.141592654);
END;

Luego de ejecutar el procedimiento,
Código SQL [-]
  EXECUTE PROCEDURE NUM_PI;
podés usarlo hasta en un SELECT, como por ejemplo:
Código SQL [-]
SELECT RDB$GET_CONTEXT('USER_TRANSACTION','NUM_PI') FROM RDB$DATABASE;

Un saludo.

Abel Garcia 11-11-2011 01:11:12

Muchas Gracias por tu amable respuesta. Ahora entiendo como seria el uso a partir de la versión 2.0.
Me imagino que el procedimiento que marcas como "CREATE PROCEDURE NUM_PI" se ejecutaria solo una vez para grabar el valor en la base de datos actual.
y despues de ahi solo haces uso de este valor a través de los dos metodos que citas.
Solamente validos para la base de datos donde ejecutaste el primer procedimiento.

ecfisa 11-11-2011 03:54:41

Cita:

Empezado por Abel Garcia (Mensaje 418197)
Me imagino que el procedimiento que marcas como "CREATE PROCEDURE NUM_PI" se ejecutaria solo una vez para grabar el valor en la base de datos actual.
y despues de ahi solo haces uso de este valor a través de los dos metodos que citas.
Solamente validos para la base de datos donde ejecutaste el primer procedimiento.

Hola Abel.

Mas o menos si... Una vez creado, el procedimiento queda en la base de datos en forma definitiva. Pero lamentablemente para lo que buscas hacer, el nombre de espacio USER_TRANSACTION persiste lo que dura la transacción activa y USER_SESION tiene una vida igual a la duración de la sesión actual, luego de la cuál ambos se inicializan. Por lo que deberías llamar al procedimiento NUM_PI para registrar el valor nuevamente.

Creo que la solución más persistente es almacenar el/los valores que van a usarse como constantes en una tabla.

Un saludo.

Delphius 11-11-2011 04:24:27

Acompaño la opinión de ecfisa, me inclinaría a pensar más en una tabla CONSTANTES y extraer de ésta el valor.

Aunque, si la idea es poder utilizar de éstas en otras bases de datos y entornos me parece lo más lógico, limpio, y natural definir UDFs... Es más no me extrañaría que ya alguien haya implementado una biblioteca llena de UDFs que implementen (o estimen) estas constantes; al menos la más comunes y empleadas en cálculos y operaciones de ingeniería. Con buscar no se pierde nada ;)

Abel Garcia 11-11-2011 07:06:42

Ups definitivo, creo que es mejor optar por una tabla de Constantes. Dado lo que me explican.
lamentable mente mi idea va un poco más orientada a soluciones que se podrían aplica a este tipo de códigos:

KIND: Columna que Identifica el tipo de Registro.

IF ( KIND in (213 /*TIPO DE REG X*/,
206 /*TIPO DE REG Y*/,
......,
......,
215/*TIPO DE REG Z*/,
)
)
THEN
BEGIN
END

Donde por ejemplo en este pedazo de código el Numero 213 me identifica un tipo en específico de Registro y para no estar marcando cada vez
" 213/*TIPO DE REG XXXX*/ " seria usar un constante con nombre y valor definido en alguna parte de la base de datos facil de cambiar o alterar sin tener que buscar en toda la BD donde se uso por ejemplo el numero 213.

Pues esa era la cuestión.

Pero pues entiendo que esto no es posible hasta el momento por lo tanto a esperar....


Muchas gracias por el Apoyo compañeros.


La franja horaria es GMT +2. Ahora son las 09:06:01.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi