RE: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Como ejecuto una función set of record desde consola

From: ALFONSO REYES <alfonsoreyescruz(at)hotmail(dot)com>
To: <postgres(dot)arg(at)gmail(dot)com>
Cc: lista ayuda postgres <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Como ejecuto una función set of record desde consola
Date: 2009-04-22 02:50:40
Message-ID: SNT113-W80964479FB992E8064CA43DF740@phx.gbl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda


Estimados
Como contribución a la lista, les dejo un ejemplo de como solucione el problema, se tuvo que crear :
1) Una estructura de type con los tipos que retorna la función
CREATE TYPE "danmaf"."ty_gen_obt_estab_punto" AS ( "establecimiento" VARCHAR, "punto" VARCHAR, "autorizacion" VARCHAR);

2) Cambiar el función como se muestra a continuación, es decir referncia al nuevo tipo creado
CREATE OR REPLACE FUNCTION "danmaf"."gen_obt_estab_punto" (p_id_empresa integer, p_unidad_adm varchar) RETURNS SETOF "danmaf"."ty_gen_obt_estab_punto" AS$body$DECLARE v_establecimiento varchar(3); v_punto varchar(3); v_rec_salida danmaf.ty_gen_obt_estab_punto;BEGIN
for v_rec_salida in SELECT fa.establecimiento,fa.punto,fa.autorizacion FROM danmaf.gen_documento gd,danmaf.fac_autorizaciones fa WHERE gd.id_documento=fa.id_documento and gd.nombre='FACTURA' and gd.id_empresa=p_id_empresa and fa.cod_unidad=p_unidad_adm loop return next v_rec_salida;
end loop; return ; END;$body$LANGUAGE 'plpgsql'VOLATILECALLED ON NULL INPUTSECURITY INVOKERCOST 100 ROWS 1000;
La manera de ejecutar desde consola es:select * from "danmaf"."gen_obt_estab_punto" (4, '1');

No está por demás indicar que cuando una función es de tipo set of y devuelve un record, no hay poder humano para ejecutarlo como indica el manual:
select * from "danmaf"."gen_obt_estab_punto" (4, '1') resp(col1, char,col2 char, col3 char); ==> ESTO NO FUNCIONA NO PIERDAN TIEMP AL MENOS EN POSTGRES 8.3 NO FUNCIONA

Si alguien tiene una mejor solución agradecería se comparta....

Nota.- No se como mandar un mail sin formato Html...

> Date: Tue, 21 Apr 2009 09:51:03 -0300
> Subject: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Como ejecuto una función set of record desde consola
> From: postgres(dot)arg(at)gmail(dot)com
> To: alfonsoreyescruz(at)hotmail(dot)com
> CC: pgsql-es-ayuda(at)postgresql(dot)org
>
> El día 20 de abril de 2009 23:30, ALFONSO REYES
> <alfonsoreyescruz(at)hotmail(dot)com> escribió:
>> Estimada Lista
>> Mi pregunta es sencilla, tengo una función de tipo return set of record con
>> 2 parámetros de ingreso int y char :
>> CREATE OR REPLACE FUNCTION "danmaf"."gen_obt_estab_punto_dos" (p_id_empresa
>> integer, p_unidad_adm varchar) RETURNS SETOF record AS
>> $body$
>> DECLARE
>> v_establecimiento varchar(3);
>> v_punto varchar(3);
>> v_rec_salida record;
>> BEGIN
>> for v_rec_salida in
>> (SELECT fa.establecimiento,fa.punto,fa.autorizacion
>> FROM danmaf.gen_documento gd,danmaf.fac_autorizaciones fa
>> WHERE gd.id_documento=fa.id_documento
>> and gd.nombre='FACTURA'
>> and gd.id_empresa=p_id_empresa
>> and fa.cod_unidad=p_unidad_adm)
>> loop
>> return next v_rec_salida;
>> end loop;
>> return;
>> END;
>> $body$
>> LANGUAGE 'plpgsql'
>> VOLATILE
>> CALLED ON NULL INPUT
>> SECURITY INVOKER
>> COST 100 ROWS 1000;
>>
>>
>> Según lo que he leído en la red y una vez que me ayudo Alvaro Herrera, creo
>> que estoy haciendo lo correcto:
>> INTERNET DICE QUE SE EJECUTA ASI:
>> SELECT "danmaf"."gen_obt_estab_punto_dos"(4,'1') as f(col1 char,col2 char
>> ,col3 char );
>>
>> SELECT "danmaf"."gen_obt_estab_punto_dos"(4,'1') as
>> f(col1 text,col2 text ,col3 text );
>>
>> RESULTADO ERROR :
>> ERROR: syntax error at or near "("
>> LINE 1: ...ECT "danmaf"."gen_obt_estab_punto_dos"(4,'1') as f(cola text...
>> ALVARO ME INDICO EN ESTE CORREO:
>>
>> ALFONSO REYES escribió:
>>
>> Marcos, muchas gracias por tú ayuda, pero a lo que me refiero es como
>> debería
>> jecutarla desde el query builder, por ejemplo a las funciones que retirnan
>> un refcursor se las ejecuta asi: Begin; select funcion('resp_ref_cursor');
>> fecth all in "resp_ref_cursor"; commit;
>>
>> En cambio cuando es un afunción de tipo record como la ejecuto desde el
>> query
>> builder..
>>
>> select * from function( ... )
>>
>> Si es "setof record" entonces tienes que especificar el tipo del record:
>>
>> select * from function( ... ) as f(a int, b text, c text, ...)
>>
>> -- Alvaro Herrera http://www.PlanetPostgreSQL.org/ "I'm impressed how
>> quickly you are fixing this obscure issue. I came from MS SQL and it would
>> be hard for me to put into words how much of a better job you all are doing
>> on [PostgreSQL]." Steve Midgley,
>> http://archives.postgresql.org/pgsql-sql/2008-08/msg00000.php
>>
>> -- TIP 3: Si encontraste la respuesta a tu problema, publícala, otros te lo
>> agradecerán
>>
>> Para terminar cuando la ejecuto desde el EXECUTE de la función del SQL
>> MANAGER FOR POSTGRES 2007 SI FUNCIONA !!! Y PRIMERO ME PIDE LAS COLUMNAS y
>> luego obtengo el resultado,
>>
>> por favor quisiera saber que estoy haciendo mal...
>
> Retorna un set of record,
>
> SELECT * FROM "danmaf"."gen_obt_estab_punto_dos" (1, 'empresa');
>
>
> No mandes en formato HTML el mail por favor.
>
>
> --
> Emanuel Calvo Franco
> Sumate al ARPUG !
> (www.postgres-arg.org -
> www.arpug.com.ar)
> ArPUG / AOSUG Member
> Postgresql Support & Admin
> --
> TIP 9: visita nuestro canal de IRC #postgresql-es en irc.freenode.net

_________________________________________________________________
Show them the way! Add maps and directions to your party invites.
http://www.microsoft.com/windows/windowslive/products/events.aspx

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2009-04-22 02:53:15 Re: RE: [pgsql-es-ayuda] Re: [pgsql-es-ayuda] Como ejecuto una función set of record desde consola
Previous Message Julio Cesar Rodriguez Dominguez 2009-04-22 02:06:26 Re: donde esta el ejecutable del servicio?