PostgreSQL - uso de trigger en la misma tabla

 
Vista:

uso de trigger en la misma tabla

Publicado por Andres Felipe Bedoya (1 intervención) el 20/12/2018 16:08:55
Buen dia!!

Deseo saber como puedo operar dos columnas para almacenar su resultado en una tercera columna por medio de un trigger.

la funcion que estoy utilizando es la siguiente

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
CREATE OR REPLACE FUNCTION ipshorisoes.recalcular_imc()
  RETURNS trigger AS
$BODY$
declare
 
BEGIN
	if (old.q_151 != new.q_151) then
	  		new.q_153 := round((cast(new.q_151 as float)/((cast(old.q_152 as int)/100)*(cast(old.q_152 as int)/100)))::numeric,1);
			return new;
 
	elsif (old.q_152 != new.q_152) then
			new.q_153 := round((cast(old.q_151 as float)/((cast(new.q_152 as int)/100)*(cast(new.q_152 as int)/100)))::numeric,1);
			return new;
 
	elsif (old.q_152 != new.q_152 and old.q_151 != new.q_151) then
			new.q_153 := round((cast(new.q_151 as float)/((cast(new.q_152 as float)/100)*(cast(new.q_152 as float)/100)))::numeric,1);
			RETURN new;
	end if;
	return null;
  end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION ipshorisoes.recalcular_imc()
  OWNER TO postgres;

donde necesito operar los campos q_151 y q_152 para almacenar su valor en el campo q_153. los tres campos de tipo texto por lo tanto debo realizar su casteo para por realizar la operacion que es el calculo de indice de masa corporal.

el problema es que no me esta realizando la operacion dentro de la tabla simplemente el valor que inserto en el campo q_151 es el que me actualiza en el campo q_153 sin realizar la respectiva operacion.

espero me puedan ayudar, muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 15
Ha mantenido su posición en PostgreSQL (en relación al último mes)
Gráfica de PostgreSQL

uso de trigger en la misma tabla

Publicado por Ratonaso (8 intervenciones) el 03/05/2019 22:22:31
Hola, considero que tus condiciones se pueden simplificar de la siguiente manera dado que solo te interesa si hubo un cambio den alguno de los dos elementos para recalcular, en caso de que sea así recalculamos utilizando los valores new, los old ya no son de interes y se utilizando en el casteo variables float para evitar que te trunque al convertirlo a int lo que supongo esta haciendo el cast(180 as int)/100=1,
por lo tanto 1*1=1 divide el resultado de new.q_151 entre uno.

1
2
3
4
5
6
if (old.q_151 != new.q_151) or (old.q_152 != new.q_152)
then
    new.q_153 := round((cast(new.q_151 as float)/((cast(new.q_152 as float)/100)*(cast(new.q_152 as float)/100)))::numeric,1);
    return new;
 
end if;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar