Ver Mensaje Individual
  #1 (permalink)  
Antiguo 25/11/2009, 09:09
Avatar de webness
webness
 
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
Procedimiento con campos de select variables

HOLA.


tengo un procedimiento almacenado, el cual puede ejecutar 3 query diferentes, estos a su ves son variables en los campos del select. el procedimiento debe retorna los registros del query que ejecute.

colocar el nombre de la tabla en el tipo de retorno no puedo, porque la conuslta segun el query es a una tabla distinta.

por ahora tengo cree un tipo con la maxima cantidad de datos del select que retorno, lo cual me obligo a usar comodines en los otros querys.

es decir que si en el tipo creado tengo los campos A,B,C,D,E,F Y en el query Uno retorno todos los campos, pero en el query dos retorno SOLO A,B,C,'','',F Y EN el tercer query el select queda por ejemplo asi A,'',B,C,D,'',F.

ADJUNTO EL PROCEDIMIENTO REAL

Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION p_get_blocks_count(INTEGER, VARCHAR,VARCHAR,VARCHAR,VARCHAR) RETURNS SETOF t_blocks_count AS $BODY$
  2. DECLARE
  3.     FILTER              ALIAS FOR $1;  
  4.     area_list           ALIAS FOR $2;
  5.     city_list           ALIAS FOR $3;
  6.     socioeconomic_list  ALIAS FOR $4;
  7.     country             ALIAS FOR $5;
  8.    
  9.     sql_query VARCHAR;
  10.     query_result t_blocks_count;
  11. BEGIN
  12.     IF FILTER = 1 THEN
  13.         sql_query := '  SELECT  country_name,region_name,city_name,locale_name,locale_code,$$''$$,$$''$$,socioeconomic_status,city_code,total
  14.                         FROM    conteo_manzanas_localidad_'||country||'
  15.                         WHERE   locale_code             IN ('||area_list||') AND
  16.                                 city_code               IN ('||city_list||') AND
  17.                                 socioeconomic_status    IN ('||socioeconomic_list||')';
  18.         FOR query_result IN EXECUTE sql_query LOOP RETURN NEXT query_result;
  19.         END LOOP;          
  20.     ELSE
  21.         IF FILTER = 2 THEN
  22.             sql_query := '  SELECT  country_name,region_name,city_name,locale_name,locale_code,neighborhood_name,neighborhood_code,socioeconomic_status,city_code,total
  23.                             FROM    conteo_manzanas_barrio_'||country||'
  24.                             WHERE   neighborhood_code       IN ('||area_list||') AND
  25.                                     city_code               IN ('||city_list||') AND
  26.                                     socioeconomic_status    IN ('||socioeconomic_list||')';
  27.             FOR query_result IN EXECUTE sql_query LOOP RETURN NEXT query_result;
  28.             END LOOP;
  29.         ELSE
  30.             sql_query := '  SELECT  country_name,region_name,city_name,$$''$$,$$''$$,$$''$$,$$''$$,socioeconomic_status,city_code,total
  31.                             FROM    conteo_manzanas_municipio_'||country||'
  32.                             WHERE   city_code               IN ('||city_list||') AND
  33.                                     socioeconomic_status    IN ('||socioeconomic_list||')';
  34.             FOR query_result IN EXECUTE sql_query LOOP RETURN NEXT query_result;
  35.             END LOOP;
  36.         END IF;
  37.     END IF;
  38.     RETURN;
  39. END $BODY$
  40. LANGUAGE plpgsql;

existe alguna forma de evitar eso?