Skip site navigation (1) Skip section navigation (2)

Re: Sentencia DML dinamica.

From: Daniel Orozco <daniel(dot)orozco(dot)jaramillo(at)gmail(dot)com>
To: Alvaro Herrera <alvherre(at)commandprompt(dot)com>, pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Sentencia DML dinamica.
Date: 2010-10-26 16:08:22
Message-ID: AANLkTimbgwaDs5v_D=CQhB=xWdT_URYAkADNy2_=reCF@mail.gmail.com (view raw or flat)
Thread:
Lists: pgsql-es-ayuda
Claro que si alvaro.

La forma como lo tengo actualmente.
t_enero_nino =
markov_generar_tablas(codigo_estacion,'1','1',pun_cor_bsol,pun_cor_tmax,pun_cor_tmin,pun_cor_tmed,pun_cor_prec,pun_cor_hmed);
t_enero_nina =
markov_generar_tablas(codigo_estacion,'1','2',pun_cor_bsol,pun_cor_tmax,pun_cor_tmin,pun_cor_tmed,pun_cor_prec,pun_cor_hmed);
t_enero_neutro =
markov_generar_tablas(codigo_estacion,'1','3',pun_cor_bsol,pun_cor_tmax,pun_cor_tmin,pun_cor_tmed,pun_cor_prec,pun_cor_hmed);
.
.
.
Esto lo repito 36 veces en 36 diferentes variables.
Cada variable me almacena una estructura como esta.
"{"(\"{2.05416666666667,1.38778230148394,0,4}\",\"{{4,10,7,26,10,23,27,170},{2,7,4,20,7,17,20,262},{60,35,23,40,36,27,40,78},{5,6,6,17,6,17,17,265},{134,41,33,22,42,14,22,31},{53,16,12,11,15,7,10,29}}\")","(\"{7.52770562770563,1.44890165895275,4.1,10.1}\",\"{{4,10,7,26,10,23,27,170},{2,7,4,20,7,17,20,262},{60,35,23,40,36,27,40,78},{5,6,6,17,6,17,17,265},{134,41,33,22,42,14,22,31},{53,16,12,11,15,7,10,29}}\")","(\"{27.0969696969697,1.47000953408574,23,28.5}\",\"{{4,10,7,26,10,23,27,170},{2,7,4,20,7,17,20,262},{60,35,23,40,36,27,40,78},{5,6,6,17,6,17,17,265},{134,41,33,22,42,14,22,31},{53,16,12,11,15,7,10,29}}\")","(\"{31.3159090909091,1.2385397063019,28.6,34.5}\",\"{{4,10,7,26,10,23,27,170},{2,7,4,20,7,17,20,262},{60,35,23,40,36,27,40,78},{5,6,6,17,6,17,17,265},{134,41,33,22,42,14,22,31},{53,16,12,11,15,7,10,29}}\")","(\"{16.39875,0.930002197873841,13.5,17.5}\",\"{{4,10,7,26,10,23,27,170},{2,7,4,20,7,17,20,262},{60,35,23,40,36,27,40,78},{5,6,6,17,6,17,17,265},{134,41,33,22,42,14,22,31},{53,16,12,11,15,7,10,29}}\")","(\"{18.7292817679558,0.695440734074496,17.6,20.5}\",\"{{4,10,7,26,10,23,27,170},{2,7,4,20,7,17,20,262},{60,35,23,40,36,27,40,78},{5,6,6,17,6,17,17,265},{134,41,33,22,42,14,22,31},{53,16,12,11,15,7,10,29}}\")"}"

La primera parte (del tipo de dato creado por mi) corresponde a un arreglo
de dlouble precision que me almacena información especifica de cada una de
las 36 corridas de la función anterior.
La segunda parte es un array de integer[] que de igual forma me almacena
unas tablas de conteo por cada una de las 36 variables creadas.

Tengo un cursor
cur_0 CURSOR FOR
SELECT
fec_clima,
bri_sol_clima,
tem_max_clima,
tem_min_clima,
tem_med_clima,
pre_clima,
hum_rel_clima,
evento_clima
FROM clima
WHERE cod_estacion=codigo_estacion;

que me debe recorrer registro por registro e identificar en que celda existe
un dato faltante. (Yo los he marcado como -99)

Dentro de cada registro del cursor, debo comparar si cada una de las 6
variables es -99. Pero esto debo hacerlo para cada una de las 36
combinaciones posibles.

ETCH ABSOLUTE 3 FROM cur_0 INTO
v_fecha,v_bsol,v_tmax,v_tmin,v_tmed,v_prec,v_hmed,v_evento;
WHILE found LOOP
        FOR i IN (absolute_cont-3)..(absolute_cont-1) LOOP
    FETCH ABSOLUTE (absolute_cont - cont) FROM cur_0 INTO
v_fecha,v_bsol,v_tmax,v_tmin,v_tmed,v_prec,v_hmed,v_evento;
            ----------------------------------------
    --Validacion de mes de enero brillo ----
    ----------------------------------------
    IF v_bsol = -99 AND EXTRACT(month FROM v_fecha)=1  THEN
       IF v_evento = 1 THEN
  v_bsol :=
markov_generar_datos('bri_sol_clima',t_enero_nino,v_eventos_anteriores);
          UPDATE clima SET bri_sol_clima = v_bsol,bri_est_clima='S' WHERE
CURRENT OF cur_0;
       END IF;
       IF v_evento = 2 THEN
                  v_bsol :=
markov_generar_datos('bri_sol_clima',t_enero_nina,v_eventos_anteriores);
          UPDATE clima SET bri_sol_clima = v_bsol,bri_est_clima='S' WHERE
CURRENT OF cur_0;
       END IF;
       IF v_evento = 3 THEN
  v_bsol :=
markov_generar_datos('bri_sol_clima',t_enero_neutro,v_eventos_anteriores);
          UPDATE clima SET bri_sol_clima = v_bsol,bri_est_clima='S' WHERE
CURRENT OF cur_0;
       END IF;
    END IF;
    ----------------------------------------
    --Validacion de mes de enero tmax ----
    ----------------------------------------
    IF v_tmax = -99 AND EXTRACT(month FROM v_fecha)=1  THEN
       IF v_evento = 1 THEN
  v_tmax :=
markov_generar_datos('tem_max_clima',t_enero_nino,v_eventos_anteriores);
          UPDATE clima SET tem_max_clima = v_tmax,tma_est_clima='S' WHERE
CURRENT OF cur_0;
       END IF;
       IF v_evento = 2 THEN
                  v_tmax :=
markov_generar_datos('tem_max_clima',t_enero_nina,v_eventos_anteriores);
          UPDATE clima SET tem_max_clima = v_tmax,tma_est_clima='S' WHERE
CURRENT OF cur_0;
       END IF;
       IF v_evento = 3 THEN
  v_tmax :=
markov_generar_datos('tem_max_clima',t_enero_neutro,v_eventos_anteriores);
          UPDATE clima SET tem_max_clima = v_tmax,tma_est_clima='S' WHERE
CURRENT OF cur_0;
       END IF;
    END IF;

Como vez, en el poco codigo, he validado 2 de las 6 variables para el mes de
enero.
Actualmente valido de esta forma los 12 meses del año por cada variable.

Si te fijas en la función markov_generar_datos recibe como
segundo parámetro t_enero_nino que varía en cada una de las condiciones que
menciono. (36 en total)

La idea de las tablas temporales es poder crear una tabla con el tipo de
dato creado y hacer unicamente 36 inserciones al principio.
El numero de validaciones se reduce de (12*3)*3 internas (para un total de
108) a 6 validaciones. teniendo la posibilidad dentro de la función
markov_generar_datos de elegir una de las 36 variables según los parametros
de entrada.

No se si hayas recibido mi anterior post donde digo que ya he probado con
CREATE LOCAL TEMPORARY TABLE y me soluciona el problema.
Sin embargo explico también que según la documentación oficial me pasan
cosas que no deberían y me preocupa que se trate de algún tipo de bug.

Gracias por tu paciencia y ayuda.

saludos




El 26 de octubre de 2010 10:44, Alvaro Herrera
<alvherre(at)commandprompt(dot)com>escribió:

> Excerpts from Daniel Orozco's message of mar oct 26 12:24:34 -0300 2010:
> > Alvaro... tal vez no recibiste mi segundo post donde explico que la razón
> de
> > utilizar tablas temporales es hacer mi código mucho mas legible. En estos
> > momentos tengo una función que supera las 1300 lineas de código. usando
> SQL
> > dinamico y trabajando de esta forma, esto me evitaría mas de 36
> validaciones
> > repetitivas de los datos haciendo mi codigo mas legible y administrable a
> > posibles cambios.
>
> Recibí el otro post.  Ya entendí que quieres hacer código más legible.
> Lo que no me queda claro es por qué quieres usar una tabla temporal y no
> algún otro mecanismo para guardar los datos que quieres pasar de un lado
> a otro.  Creo que estás hablando demasiado en abstracto; quizás un
> extracto de código ejemplo de lo que estás reemplazando sería útil para
> darte una sugerencia más concreta.
>
> --
> Álvaro Herrera <alvherre(at)commandprompt(dot)com>
> The PostgreSQL Company - Command Prompt, Inc.
> PostgreSQL Replication, Consulting, Custom Development, 24x7 support
>



-- 
Daniel Orozco Jaramillo
Ing. Sistemas y Telecomunicaciones
OCE (Oracle Certified SQL Expert)

In response to

Responses

pgsql-es-ayuda by date

Next:From: Alvaro HerreraDate: 2010-10-26 16:44:17
Subject: Re: Sentencia DML dinamica.
Previous:From: Alvaro HerreraDate: 2010-10-26 15:51:07
Subject: Re: Cambiar disco de tablespace

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group