Ver Mensaje Individual
  #1 (permalink)  
Antiguo 12/10/2010, 17:14
Avatar de webness
webness
 
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 11 meses
Puntos: 5
Exclamación Problema en retorno de un store procedure

hola a todos tengo ste procedimiento almacenada que retorna, un conjunto de filas de una de tres tablas.

Código SQL:
Ver original
  1. SELECT p_shops_and_sites(3,'11001',2,$$'01','02','03','04'$$,98,0,'',0.0,0.0)
  2. CREATE OR REPLACE FUNCTION p_shops_and_sites(INTEGER,VARCHAR,INTEGER,VARCHAR,INTEGER,DOUBLE PRECISION,VARCHAR,DOUBLE PRECISION,DOUBLE PRECISION) RETURNS SETOF t_shops_and_sites AS
  3. $BODY$
  4. DECLARE
  5.     SOURCE       alias FOR $1;
  6.     city         alias FOR $2;
  7.     filter_type  alias FOR $3;
  8.     filter_value alias FOR $4;
  9.     category     alias FOR $5;
  10.     radio    alias FOR $6;
  11.     polygon  alias FOR $7;
  12.     cx       alias FOR $8;      
  13.     cy       alias FOR $9;
  14.  
  15.     TABLE_NAME    VARCHAR;
  16.     select_fields VARCHAR;
  17.     SQL           VARCHAR;
  18.     where_conds   VARCHAR;
  19.  
  20.     query_result t_shops_and_sites;
  21. BEGIN
  22.  
  23.     select_fields := 'SELECT ciudad,nombre_localidad AS localidad,nombre_barrio AS barrio,nombre_categoria AS categoria,nombre AS nom_establ,direccion,nivsocio,telefono,cx,cy,codigo_categoria';
  24.     where_conds   := ' WHERE coddane = '||QUOTE_LITERAL(city)||' AND ';
  25.  
  26.    IF SOURCE = 1 THEN  
  27.       TABLE_NAME := ' FROM servcon_sitios_interes';
  28.     ELSE  
  29.         IF SOURCE = 2 THEN
  30.             TABLE_NAME := ' FROM servcon_info2006_'||category;
  31.         ELSE
  32.             TABLE_NAME := ' FROM servcon_info2009_'||category;  
  33.         END IF;
  34.     END IF;
  35.  
  36.     IF filter_type = 1 THEN
  37.         where_conds := where_conds||' codigo_categoria = '||category;
  38.     ELSE
  39.         IF filter_type = 2 THEN
  40.             where_conds := where_conds||' codigo_localidad IN ('||filter_value||') AND codigo_categoria = '||category;
  41.         ELSE
  42.             IF filter_type = 3 THEN  
  43.                 where_conds := where_conds||' codigo_barrio IN ('||filter_value||') AND codigo_categoria = '||category;
  44.             ELSE
  45.                 IF filter_type = 4 THEN  
  46.                     where_conds := where_conds||'  CIRCLE '||quote_literal('(('||cx||','||cy||'),'||radio||')')||' ~ POINT (cx,cy) AND codigo_categoria = '||category;
  47.                 ELSE
  48.                     where_conds := where_conds||'  INTERSECTS(geom,GeometryFromText(('||QUOTE_LITERAL(polygon)||'), -1)) AND codigo_categoria = '||category;
  49.                 END IF;
  50.             END IF;
  51.         END IF;
  52.     END IF;    
  53.     SQL := select_fields||TABLE_NAME||where_conds;
  54.  
  55.    
  56.     FOR query_result IN EXECUTE SQL LOOP
  57.         RETURN NEXT query_result;
  58.     END LOOP;
  59.    
  60.     RETURN SQL;
  61. END $BODY$
  62.   LANGUAGE 'plpgsql';
  63.  
  64. CREATE TYPE t_shops_and_sites AS (
  65. ciudad VARCHAR,
  66. localidad VARCHAR,
  67. barrio VARCHAR,
  68. categoria VARCHAR,
  69. nom_establ VARCHAR,
  70. direccion VARCHAR,
  71. nivsocio VARCHAR,
  72. telefono VARCHAR,
  73. cx DOUBLE PRECISION,
  74. cy DOUBLE PRECISION,
  75. codigo_categoria INTEGER);

adjunto el codigo del sp, del tipo creado para el retorno y la forma en como llamo el sp.

ya cree un sp alterno para verficar que el sql que ejecuto dinamicamente quedo bien armado y asi es. pero me aparece este error

ERROR: set-valued function called in context that cannot accept a set
CONTEXT: PL/pgSQL function "p_shops_and_sites" line 54 at return next

thanks