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

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
    codigoALIAS 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....@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




---
El software de antivirus Avast ha analizado este correo electrónico en busca de 
virus.
https://www.avast.com/antivirus

Responder a