Si deseas no tener que usar el AS cuando la invocas podrias crear un tipo de 
datos y retornar el SETOF de ese tipo de datos asi si podrias llamarla SELECT 
f('01') sin tener que usar el AS, me gusta mas esta forma es mas limpia y 
puedes docuemntar bien ese tipo ademas si son 80 campos imaginate ese AS


________________________________
From: pgsql-es-ayuda-ow...@postgresql.org <pgsql-es-ayuda-ow...@postgresql.org> 
on behalf of Anthony Sotolongo <asotolo...@gmail.com>
Sent: Tuesday, January 19, 2016 7:21 PM
To: Alberto Cuevas; Hellmuth Vargas
Cc: pgsql-es-ayuda@postgresql.org
Subject: Re: [pgsql-es-ayuda] Funcion con RETURNS SETOF record

Hola nuevamente, respondo entre lineas:


El 19-01-2016 a las 15:44, Alberto Cuevas escribió:
Muchas gracias por tu respuesta, tengo dos consultas mas:

1 - Si tengo 80 campos en mi select tambien debo mencionarlos es decir:

SELECT * from f_xconsulta('01') as (campo1 CHAR(2), campo2 VARCHAR(20), campo3 
VARCHAR(4)..............campo80 CHAR(1));

Hasta donde conozco si debes mencionarlos todos, es para, como te decía 
anteriormente, castear el resultado de salida de la función, si te es incomodo 
llamarlos así, puedes usar RETURNS TABLE en vez de RETURNS SETOF record , si lo 
que vas a ejecutar una query sin muchas lógica dentro de una función, tal vez 
te convenga utilizar una función SQL en vez de una plgsql, puede que resulte un 
poco más rápido.

2 - RETURN  QUERY hace lo mismo que

FOR _registro IN
SELECT COD_PER,
NOM_PER
FROM XPERSONA
WHERE COD_PER = codigo
loop
 return next _registro;

END LOOP;

Hay alguna ventaja o diferencia o recomendacion?
puedes leer esto:
http://www.postgresql.org/docs/9.5/interactive/plpgsql-control-structures.html#PLPGSQL-STATEMENTS-RETURNING
[http://www.postgresql.org/media/img/docs/hdr_logo.png]<http://www.postgresql.org/docs/9.5/interactive/plpgsql-control-structures.html#PLPGSQL-STATEMENTS-RETURNING>

PostgreSQL: Documentation: 9.5: Control 
Structures<http://www.postgresql.org/docs/9.5/interactive/plpgsql-control-structures.html#PLPGSQL-STATEMENTS-RETURNING>
www.postgresql.org
40.6. Control Structures. Control structures are probably the most useful (and 
important) part of PL/pgSQL. With PL/pgSQL 's control structures, you can 
manipulate ...



saludos

Saludos.
El mar., 19 ene. 2016 a las 10:55, Hellmuth Vargas 
(<hiv...@gmail.com<mailto:hiv...@gmail.com>>) escribió:
Hola Lista

La reescribí asi:

CREATE OR REPLACE FUNCTION public.f_xconsulta(character varying) RETURNS SETOF 
record AS
$BODY$
DECLARE
codigo ALIAS FOR $1;
_registro record;

BEGIN
RETURN  QUERY SELECT COD_PER,
NOM_PER
FROM XPERSONA
WHERE COD_PER = codigo;

END;

$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100

ROWS 1000;


Para ejecutar:

SELECT * from f_xconsulta('01') as (COD_PER CHAR(2),NOM_PER VARCHAR(20));






2016-01-19 10:46 GMT-05:00 Alberto Cuevas 
<<mailto:betocuevas....@gmail.com>betocuevas....@gmail.com<mailto:betocuevas....@gmail.com>>:
Hola estoy haciendo unas pruebas para usar una función con RETURNS SETOF 
record, con los siguiente:

CREATE TABLE XPERSONA (
COD_PER CHAR(2),
NOM_PER VARCHAR(20));

INSERT INTO XPERSONA VALUES ('01', 'ALBERTO');
INSERT INTO XPERSONA VALUES ('02', 'CARLOS');
INSERT INTO XPERSONA VALUES ('03', 'JUAN');

CREATE OR REPLACE FUNCTION public.f_xconsulta(character varying) RETURNS SETOF 
record AS
$BODY$
DECLARE
codigo ALIAS FOR $1;
_registro record;

BEGIN

FOR _registro IN
SELECT COD_PER,
NOM_PER
FROM XPERSONA
WHERE COD_PER = codigo
loop
 return next _registro;

END LOOP;

RETURN;
END;

$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100

ROWS 1000;


Pero al ejecutar:

SELECT f_xconsulta('01');

Me muestra el siguiente mensaje en PGAdmin:

ERROR: se llamó una función que retorna un conjunto en un contexto que no puede 
aceptarlo CONTEXT: función PL/pgSQL f_xconsulta(character varying) en la línea 
17 en RETURN NEXT

********** Error **********

ERROR: se llamó una función que retorna un conjunto en un contexto que no puede 
aceptarlo SQL state: 0A000 Context: función PL/pgSQL f_xconsulta(character 
varying) en la línea 17 en RETURN NEXT

Me podrian dar una mano por favor. Uso Postgresql 9.4.5.



--
Cordialmente,

Ing. Hellmuth I. Vargas S.
Esp. Telemática y Negocios por Internet
Oracle Database 10g Administrator Certified Associate
EnterpriseDB Certified PostgreSQL 9.3 Associate


[https://ipmcdn.avast.com/images/logo-avast-v1.png]<https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient>
    Este correo electrónico se ha enviado desde un equipo libre de virus y 
protegido por Avast.
www.avast.com<https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient>

Responder a