Re: Funcion con RETURNS SETOF record

From: Alberto Cuevas <betocuevas(dot)net(at)gmail(dot)com>
To: Edwin Quijada <listas_quijada(at)hotmail(dot)com>, Anthony Sotolongo <asotolongo(at)gmail(dot)com>, Hellmuth Vargas <hivs77(at)gmail(dot)com>
Cc: "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Funcion con RETURNS SETOF record
Date: 2016-01-22 16:21:02
Message-ID: CA+mENxoPDMxtz66ifYnn5WA749_K=o2h0aCCDnVdsn5fwvsYkA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Gracias por tu consejo Edwin.

Saludos.

El vie., 22 ene. 2016 a las 11:07, Edwin Quijada (<
listas_quijada(at)hotmail(dot)com>) escribió:

> 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-owner(at)postgresql(dot)org <
> pgsql-es-ayuda-owner(at)postgresql(dot)org> on behalf of Anthony Sotolongo <
> asotolongo(at)gmail(dot)com>
> *Sent:* Tuesday, January 19, 2016 7:21 PM
> *To:* Alberto Cuevas; Hellmuth Vargas
> *Cc:* pgsql-es-ayuda(at)postgresql(dot)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/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 (<hivs77(at)gmail(dot)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 < <betocuevas(dot)net(at)gmail(dot)com>
>> betocuevas(dot)net(at)gmail(dot)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://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>
>

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2016-01-22 16:21:39 Re: conectar con Amazon
Previous Message MKHotmail 2016-01-22 16:14:45 RE: conectar con Amazon