Por si sale error, tambien no te olvides de haber creado el tipo aux_dir, que estas definiendo en RETURNS SETOF de tu Funcion.




El amor es el significado último de todo lo que nos rodea. No es un simple sentimiento, es la verdad, es la alegría que está en el origen de toda creación. .:: J @ v i e r ::.


From: "Miguel Angel" <mvillagomez@sayab.com.mx>
To: <pgsql-es-ayuda@postgresql.org>
CC: <pgsql-es-ayuda@postgresql.org>
Subject: RE: [pgsql-es-ayuda] Regresando tabla
Date: Tue, 7 Mar 2006 17:48:37 -0600
>Bueno ya he encontrado el fallo, después de leer todo lo que encontré de
>RETURN NEXT. El problema era la forma en como llamo a la función ya que esta
>me esta regresando una tabla debo leerla:
>
>SELECT * FROM prueba();
>
>En este caso debo tratar a la función como una tabla.
>Perdón por hacer basura.
>
>
>-----Mensaje original-----
>De: Miguel Angel [mailto:mvillagomez@sayab.com.mx]
>Enviado el: Martes, 07 de Marzo de 2006 04:32 p.m.
>Para: 'pgsql-es-ayuda@postgresql.org'
>Asunto: Regresando tabla
>
>
>Qué tal lista.
>Ok, tengo dos tablas:
>
>Tabla1 Tabla2
>Clave Nombre Clave Tipo
>1 A 1A AA2
>2 B 1B ZX8
>3 C 1C A12
>4 D 2A C96
>5 E 2B AY4
>
>Me hice una consulta para que me trajera la columna Clave de la Tabla 2 sin
>la ultima letra. Eso ya quedo así:
>
>SELECT (SUBSTRING(clave,1,(LENGTH(clave)-1)))AS clave, tipo FROM tabla2
>
>Con lo que las tables quedan así:
>
>Tabla1 Tabla2 Resultado
>Clave Nombre Clave Tipo Clave Tipo
>1 A 1A AA2 1 AA2
>2 B 1B ZX8 1 ZX8
>3 C 1C A12 1 A12
>4 D 2A C96 2 C96
>5 E 2B AY4 2 AY4
>
>Ahora lo que tengo que hacer es unir las diferentes claves que hay dentro de
>la tabla 1 con su respectivo valor de la tabla resultante o sea:
>
>Clave Nombre Clave Tipo
>1 A 1 AA2
> 1 ZX8
> 1 A12
>
>2 B 2 C96
> 2 AY4
>
>Bien me dirán que esto lo puedo hacer con un CROSS JOIN, pero debo hacerlo
>fila a fila, y solo en aquellos valores que coincidan con la tabla
>resultante, por lo que hice una función con plpgsql. Pero mi problema es que
>no se como poder regresar la tabla resultante por la función. Para poder
>hacer el CROSS junto con la fila de la Tabla1.
>Estoy intentado con este code:
>
>CREATE OR REPLACE FUNCTION prueba() RETURNS SETOF aux_dir AS $$
>DECLARE
> a aux_dir%ROWTYPE;
>BEGIN
> FOR a IN (SELECT (SUBSTRING(clave,1,(LENGTH(clave)-1)))AS clave, tipo FROM
>tabla2) LOOP
> RETURN NEXT a;
> END LOOP;
> RETURN;
>END;
>$$ LANGUAGE PLPGSQL;
>
>SELECT prueba();
>
>Pero me sale este error:
>
>ERROR: set-valued function called in context that cannot accept a set
>CONTEXT: PL/pgSQL function "prueba" line 5 at return next
>
>Puse todo por si alguien se le ocurre una mejor idea.
>Espero haberme explicado claramente.
>
>
>
>
>---------------------------(fin del mensaje)---------------------------
>TIP 10: visita nuestro canal de IRC #postgresql-es en irc.freenode.net