Hola MK. Primero cambiaría la funcion CREATE OR REPLACE FUNCTION public.grabar_importaciones()RETURNS void AS$BODY$BEGIN UPDATE productos p SET nombre_producto = r.nombre_producto, idfamilia = r.idfamilia, idsubfamilia = r.idsubfamilia FROM tbl_temporal r Where p.idproducto = r.idproducto ; INSERT INTO productos(idproducto, nombre_producto, idfamilia, idsubfamilia) Select r.idproducto, r.nombre_producto, r.idfamilia, r.idsubfamilia From tbl_temporal r LEFT JOIN productos p USING(idproducto) Where p.idproducto IS NULL; END; $BODY$LANGUAGE 'plpgsql' VOLATILE; Ahora prueba con:Perform * public.grabar_importaciones()
Saludos.Mauricio El Miércoles 6 de abril de 2016 10:08, MKHotmail <mcanc...@hotmail.com> escribió: #yiv0855783965 #yiv0855783965 -- _filtered #yiv0855783965 {font-family:Wingdings;panose-1:5 0 0 0 0 0 0 0 0 0;} _filtered #yiv0855783965 {panose-1:2 4 5 3 5 4 6 3 2 4;} _filtered #yiv0855783965 {font-family:Calibri;panose-1:2 15 5 2 2 2 4 3 2 4;}#yiv0855783965 #yiv0855783965 p.yiv0855783965MsoNormal, #yiv0855783965 li.yiv0855783965MsoNormal, #yiv0855783965 div.yiv0855783965MsoNormal {margin:0cm;margin-bottom:.0001pt;font-size:11.0pt;color:black;}#yiv0855783965 a:link, #yiv0855783965 span.yiv0855783965MsoHyperlink {color:#0563C1;text-decoration:underline;}#yiv0855783965 a:visited, #yiv0855783965 span.yiv0855783965MsoHyperlinkFollowed {color:#954F72;text-decoration:underline;}#yiv0855783965 span.yiv0855783965EstiloCorreo17 {color:windowtext;}#yiv0855783965 span.yiv0855783965EstiloCorreo18 {color:#1F497D;}#yiv0855783965 span.yiv0855783965EstiloCorreo19 {color:#1F497D;}#yiv0855783965 .yiv0855783965MsoChpDefault {font-size:10.0pt;} _filtered #yiv0855783965 {margin:70.85pt 3.0cm 70.85pt 3.0cm;}#yiv0855783965 div.yiv0855783965WordSection1 {}#yiv0855783965 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] En nombre de Anthony Sotolongo Enviado el: miércoles, 06 de abril de 2016 10:02 a.m. Para: MKHotmail <mcanc...@hotmail.com>; 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] En nombre de Anthony Sotolongo Enviado el: miércoles, 06 de abril de 2016 09:55 a.m. Para: MKHotmail <mcanc...@hotmail.com>; 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