Ver Mensaje Individual
  #1 (permalink)  
Antiguo 20/03/2006, 09:37
druidasm
 
Fecha de Ingreso: enero-2004
Mensajes: 71
Antigüedad: 21 años, 2 meses
Puntos: 0
Uso del execute en PLPGSQL

Saludos en esta ocación me dirijo a ustedes con el siguiente problema:

Tengo una función en la cual un query es armado segun los parametros que tengan valor que son enviados a la función, necesito retornar un conjunto de registros para lo cual utilizo un for pero al realizar la concatenación del query y luego trato de ejecutarlo con el execute parece ser que este comando no reconoce la sentencia for porq justa da error en el primer caracter del query... a continuación coloco la función:


CREATE OR REPLACE FUNCTION "public"."rep_organizacion" (fecha_inicial date, fecha_final date, cod_organizacion integer, cod_categoria integer) RETURNS SETOF "pg_catalog"."record" AS
$body$
DECLARE
roworganizacion RECORD;
tira varchar(8000);
st_fechaIniciales varchar(60);
st_fechaFinales varchar(60);
inl_organizaciones varchar(60);
inl_categoEquipos varchar(60);
BEGIN

tira := 'FOR roworganizacion IN SELECT t_datos_presupuesto.codigo_relacion,
t_datos_presupuesto.codigo_indicador,
t_datos_presupuesto.cantid_equipo, t_datos_presupuesto.cantid_intervalo,
t_datos_presupuesto.fecha_final, t_datos_presupuesto.fecha_inicio,
t_clase_equipo.nombre_clase_equipo, t_catego_equipo.codigo_catego_equipo,
t_catego_equipo.nombre_catego_equipo, t_tipo_esfuerzo.nombre_tipo_esfuerzo,
t_orden_esfuerzo.nombre_orden_esfuerzo, t_ceco.ceco, t_organizacion.codigo_organizacion,
SUM((CASE codigo_tipo_medicion WHEN 1 THEN valor_medida ELSE 0 END)) AS suma1,
SUM((CASE codigo_tipo_medicion WHEN 2 THEN valor_medida ELSE 0 END)) AS suma2,
SUM((CASE codigo_tipo_medicion WHEN 3 THEN valor_medida ELSE 0 END)) AS suma3,
SUM((CASE codigo_tipo_medicion WHEN 4 THEN valor_medida ELSE 0 END)) AS suma4,
SUM((CASE codigo_tipo_medicion WHEN 5 THEN valor_medida ELSE 0 END)) AS suma5,
SUM((CASE codigo_tipo_medicion WHEN 6 THEN valor_medida ELSE 0 END)) AS suma6,
SUM((CASE codigo_tipo_medicion WHEN 7 THEN valor_medida ELSE 0 END)) AS suma7
FROM t_datos_presupuesto, t_datos_relacion, t_clase_equipo, t_catego_equipo,
t_natura_esfuerzo, t_esfuerzo, t_tipo_esfuerzo, t_orden_esfuerzo, t_ceco,
t_organizacion, t_datos_medicion
WHERE t_datos_presupuesto.codigo_relacion = t_datos_relacion.codigo_relacion
AND t_datos_relacion.codigo_clase_equipo = t_clase_equipo.codigo_clase_equipo
AND t_clase_equipo.codigo_catego_equipo = t_catego_equipo.codigo_catego_equipo
AND t_datos_relacion.codigo_natura_esfuerzo = t_natura_esfuerzo.codigo_natura_esfuerzo
AND t_natura_esfuerzo.codigo_esfuerzo = t_esfuerzo.codigo_esfuerzo
AND t_esfuerzo.codigo_tipo_esfuerzo = t_tipo_esfuerzo.codigo_tipo_esfuerzo
AND t_esfuerzo.codigo_orden_esfuerzo = t_orden_esfuerzo.codigo_orden_esfuerzo
AND t_datos_relacion.codigo_ceco = t_ceco.codigo_ceco
AND t_ceco.codigo_organizacion = t_organizacion.codigo_organizacion
AND t_datos_presupuesto.codigo_relacion = t_datos_medicion.codigo_relacion
GROUP BY t_ceco.ceco, t_orden_esfuerzo.nombre_orden_esfuerzo,
t_tipo_esfuerzo.nombre_tipo_esfuerzo, t_clase_equipo.nombre_clase_equipo,
t_datos_presupuesto.cantid_equipo, t_datos_presupuesto.cantid_intervalo,
t_datos_presupuesto.codigo_indicador, t_datos_presupuesto.fecha_final,
t_catego_equipo.codigo_catego_equipo, t_catego_equipo.nombre_catego_equipo,
t_datos_presupuesto.fecha_inicio, t_organizacion.codigo_organizacion,
t_datos_presupuesto.codigo_relacion';



if(fecha_inicial <> NULL)THEN
tira := tira||' HAVING (t_datos_presupuesto.fecha_inicio >= '''||fecha_inicial||''')';
END if;

if(fecha_final <> NULL)THEN
tira := tira||' AND (t_datos_presupuesto.fecha_final <= '''||fecha_final||''')';
END if;

if(cod_organizacion <> 0)THEN
tira := tira||' AND (t_organizacion.codigo_organizacion = '||cod_organizacion||')';
end if;

if(cod_categoria <> 0)THEN
tira := tira||' AND (t_catego_equipo.codigo_catego_equipo = '||cod_categoria||')';
end if;

tira := tira||'ORDER BY t_catego_equipo.codigo_catego_equipo ASC, t_ceco.ceco ASC,
t_orden_esfuerzo.nombre_orden_esfuerzo ASC, t_clase_equipo.nombre_clase_equipo ASC
LOOP
RETURN NEXT roworganizacion;
END LOOP;';

EXECUTE tira;

RETURN;

END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;




A ver amigos en que me pueden ayudar de verdad ya estoy de cabeza y no se que hacer