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
Views: Raw Message | Whole Thread | Download mbox | Resend email
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

Browse pgsql-es-ayuda by date

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