El 8 de enero de 2009 16:19, Andres A. Mamani <[email protected]>escribió:

> Un saludo a todos los de la lista.
>
> En JavaScript se puede hacer lo siguiente:
> ..
> variable1 = 5;
> cadena = ' variable1 + 5';
> resultado = eval(cadena);
> ...
> el resultado es que se asigna a resultado = 10, la ejecución de la
> suma entre la variable1 +5; mi pregunta es si se puede hacer algo
> parecido en PostgreSql? en particular en pl/pgsql, sé que se puede
> hacer lo siguiente:
>
> variable1=5;
> cadena = variable1::varchar||'+ 5';
> execute cadena;
>
> Sin embargo tengo el incoveniente de que el nombre de las varibles
> estan almacenados en tablas y los valores de estas variables tambien
> son dinámicos algo como:
>
> variable   |    valor
> ---------------------------------
> var1        |     5
> var2        |     var1 +10
> var3        |     var2 - 1
>
> Alguna sugerencia?... de antemano gracias.
>
> Abel
>


create or replace function sumar() returns integer as $$
declare
    res int;
    variable1 int;
begin
   variable1 =5;
   execute 'select '||variable1||' + 5' into res;
   return res;
end;
$$ language 'plpgsql';

Para poder tener en una tabla las variables con sus respectivos valores
dinámicos, se me ocurre que la columna valor se divida en dos columnas,
quedando de tal manera así:


variable  |       var     |  constante
------------------------------------------------
  var1     |       0       |       5
  var2     |    var1      |     10
  var3     |    var2      |      -1


y con una función recursiva, calcular el valor de las variables:


create or replace function calcular_valor(var_ text) returns int as $$
declare
    res int;
    nueva_var text;
    parte_variable text;
    parte_constante int;
begin
   select into parte_variable,parte_constante var,constante from valores
where variable like var_;
   if parte_variable = '0' then
       return parte_constante;
   else
        execute 'select var from valores where variable like '''||var_||''''
into nueva_var;
        return calcular_valor(nueva_var)+parte_constante;
   end if;
    return res;
end;
$$ language 'plpgsql';

Responder a