Que raro eso que existe y te da el error que no existe, probaste algunas de las otras opciones que te indique?
las del casteo, tu_tipo, RETURNS TABLE?

saludos

On 06/04/16 12:17, MKHotmail wrote:

La tabla si existe, de ahí tomo los datos.

En realidad solo deseo hacer una función para tomar los datos de esa tabla(tbl_temporal) y pasarlas a productos; verificando previamente que no exista, de existir solo actualizarla.

MK

*De:*Anthony Sotolongo [mailto:asotolo...@gmail.com]
*Enviado el:* miércoles, 06 de abril de 2016 10:15 a.m.
*Para:* MKHotmail <mcanc...@hotmail.com>; pgsql-es-ayuda@postgresql.org
*Asunto:* Re: [pgsql-es-ayuda] Error en una funcion....

como dice el error, esa  tabla no existe, te fijaste si existe?

probaste el el otro modo haciendo el casteo?

también puedes hacer un tipo de datos con los atributos que debe devolver tu resultado y defines a tu función como SETOF tu_tipo y también pueden usar RETURNS TABLE (att....) para devolver. como ves son varias opciones :D para resolver el tema, que bueno por PostgreSQL :D

Saludos

On 06/04/16 12:07, MKHotmail wrote:

    Lo cambie por

    Y me manda un error :  Microsoft OLE DB Provider for ODBC Drivers
    : ERROR: no existe el tipo «tlb_temporal»;

    Error while executing the query

    CREATE OR REPLACE FUNCTION public.grabar_importaciones()

    RETURNS SETOF "tlb_temporal" AS

    $BODY$

    DECLARE

      r RECORD;

      cuenta INTEGER;

          BEGIN

    FOR r IN select * from tbl_temporal

                LOOP

    SELECT INTO cuenta count(*) FROM productos where idproducto =
    r.idproducto ;

    IF cuenta > 0 THEN

    UPDATE productos SET nombre_producto = r.nombre_producto,
    idfamilia = r.idfamilia,

    idsubfamilia = r.idsubfamilia Where idproducto = r.idproducto ;

                            ELSE

    INSERT INTO productos(idproducto, nombre_producto, idfamilia,
    idsubfamilia)

    Values(r.idproducto, r.nombre_producto, r.idfamilia, r.idsubfamilia);

    END IF ;

    return next r ;

                END LOOP;

          return ;

          END;

    $BODY$

    LANGUAGE 'plpgsql' VOLATILE;

    *De:*pgsql-es-ayuda-ow...@postgresql.org
    <mailto:pgsql-es-ayuda-ow...@postgresql.org>
    [mailto:pgsql-es-ayuda-ow...@postgresql.org] *En nombre de
    *Anthony Sotolongo
    *Enviado el:* miércoles, 06 de abril de 2016 10:02 a.m.
    *Para:* MKHotmail <mcanc...@hotmail.com>
    <mailto:mcanc...@hotmail.com>; pgsql-es-ayuda@postgresql.org
    <mailto:pgsql-es-ayuda@postgresql.org>
    *Asunto:* Re: [pgsql-es-ayuda] Error en una funcion....

    Esa función devuelve un record por ende tienes que castear tu
    resultado, deberías llamarla con algo como esto:

    Select * from public.grabar_importaciones()  as (att tipo,...);

    donde (att tipo,...)  son los atributos de la tabla tbl_temporal


    también puedes definir el returns de tu tabla como SETOF
    "tlb_temporal" y te ahorras el casteo


    Saludos



    On 06/04/16 11:56, MKHotmail wrote:

        Select public.grabar_importaciones() ;

        MK

        *De:*pgsql-es-ayuda-ow...@postgresql.org
        <mailto:pgsql-es-ayuda-ow...@postgresql.org>
        [mailto:pgsql-es-ayuda-ow...@postgresql.org] *En nombre de
        *Anthony Sotolongo
        *Enviado el:* miércoles, 06 de abril de 2016 09:55 a.m.
        *Para:* MKHotmail <mcanc...@hotmail.com>
        <mailto:mcanc...@hotmail.com>; pgsql-es-ayuda@postgresql.org
        <mailto:pgsql-es-ayuda@postgresql.org>
        *Asunto:* Re: [pgsql-es-ayuda] Error en una funcion....

        Hola, como estas llamando a esa función?



        On 06/04/16 11:49, MKHotmail wrote:

            Buenos días, estoy haciendo una función simple…y me arroja
            este error :

            Microsoft OLE DB Provider for ODBC Drivers : ERROR: se
            llamó una función que retorna un conjunto en un contexto
            que no puede aceptarlo;

            Error while executing the query

            Mi función es esta : solo es pasar la información
            importada de una tabla a la de producción(si existe
            actualiza sino lo agrega..) :

            CREATE OR REPLACE FUNCTION public.grabar_importaciones()

            RETURNS SETOF "record" AS

            $BODY$

            DECLARE

              r RECORD;

              cuenta INTEGER;

            BEGIN

                        FOR r IN select * from tbl_temporal

                        LOOP

                              SELECT INTO cuenta count(*) FROM
            productos where idproducto = r.idproducto ;

            IF cuenta > 0 THEN

                                         UPDATE productos SET
            nombre_producto = r.nombre_producto, idfamilia = r.idfamilia,

            idsubfamilia = r.idsubfamilia Where idproducto =
            r.idproducto ;

                                    ELSE

                                         INSERT INTO
            productos(idproducto, nombre_producto, idfamilia,
            idsubfamilia)

            Values(r.idproducto, r.nombre_producto, r.idfamilia,
            r.idsubfamilia);

            END IF ;

                              return next r ;

                        END LOOP;

                  return;

                  END;

            $BODY$

            LANGUAGE 'plpgsql' VOLATILE;

            Podrian indicarme por donde va mi espantoso error J

            Gracias

            MK


Responder a