Re: Funcion con RETURNS SETOF record

From: Jose Moreira <jgmoreira(at)gmail(dot)com>
To: Alberto Cuevas <betocuevas(dot)net(at)gmail(dot)com>
Cc: Edwin Quijada <listas_quijada(at)hotmail(dot)com>, Anthony Sotolongo <asotolongo(at)gmail(dot)com>, Hellmuth Vargas <hivs77(at)gmail(dot)com>, "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 18:21:22
Message-ID: CA+Hcq0xXkc9gk1cO6R7Cv8MyQoQihTnbwMG6Ms61P+L806Nc+Q@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Alberto,

Con el permiso de Sotolongo, te recomiendo su Guía, que estoy leyendo
actualmente ;-)

saludos,

2016-01-22 8:21 GMT-08:00 Alberto Cuevas <betocuevas(dot)net(at)gmail(dot)com>:

> 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>
>>
>

Attachment Content-Type Size
pl_pgsql_y_otros_lenguajes_procedurales_en_postgresql.pdf application/pdf 1.2 MB
unknown_filename text/plain 157 bytes

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message MKHotmail 2016-01-25 17:48:08 no conecta pc con Win XP
Previous Message MKHotmail 2016-01-22 16:47:49 RE: conectar con Amazon