A eso es que me refería, siempre tengo que indicar cada columna que voy a
retornar de una u otra forma y es bastante tedioso cuando tienes funciones
que retornan hasta 50 columnas.

A lo que me refiero es si no hay forma de evitar eso como en SQL server
donde solo haces:

create funtion prueba(codcia varchar(2))
returns table
as
return(select t1.campo01,t2.campo05 from t1 inner join t2 on ti.id=t2.id2)


en postgres obligatoriamente tendria que hacer:

create or replace funtion prueba(codcia varchar(2))
returns table(campo01 integer,campo05 text)
as
$BODY$
return query select t1.campo01,t2.campo05 from t1 inner join t2 on ti.id
=t2.id2;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;


o me puedo evitar la definición de columnas???


El 5 de septiembre de 2013 11:24, Miguel Angel Hernandez Moreno <
[email protected]> escribió:

> Hola
>
> creao que tienes que hacer el
>
> select * from act_depre_cuentas('01');
> as
> (campo01 tipo_dato01, campo02 tipo_dato02, ... , campoN tipo_datoN)
>
>
> o lo que puedes hacer es
>
>
>
> CREATE OR REPLACE FUNCTION act_depre_cuentas(codcia character varying(2))
>   RETURNS TABLE(campo01 tipo_dato01, campo02 tipo_dato02, ... , campoN
> tipo_datoN)  AS
>
>
> ...................
> ......................
>
> end;
> $BODY$
>   LANGUAGE plpgsql VOLATILE
>   COST 100;
>
>
>
> Asi lo resolvi alguna vez, espero te pueda servir
>
> Saludos
>
>
>
> El 5 de septiembre de 2013 10:19, Dario Andres Almonte Alonzo <
> [email protected]> escribió:
>
> buen día lista
>>
>> estoy migrando una base de datos de sql server 2005 a postgres 9.2.4,ya
>> he pasando las funciones que retornan valores escalares sin ningún problema.
>>
>> ahora estoy empezando a migrar las funciones que retornan conjuntos de
>> registros y me he encontrado con un problema, me dice que debo definir cada
>> columna que voy a retornar.
>>
>> esta es la primera función que intente migrar:
>>
>> CREATE OR REPLACE FUNCTION act_depre_cuentas(codcia character varying(2))
>>   RETURNS setof record AS
>> $BODY$
>> begin
>>
>> return query SELECT   codcia_hed,substring(referen1_hed from 11 for 6) as
>> codart_act, cnttran.idTran_hed, cnttran.modulo_hed, cnttran.codent_hed,
>> cnttran.referen1_hed,
>>  cnttran.fecha_hed, cnttran.concep_hed, cnttran.monto_hed,
>> cntdeta.numcta_det,
>>                       cntdeta.centro_det, cntdeta.debito_det,
>> cntdeta.credito_det, cntdeta.debcre_det,
>>  (select nomcta_cat from cntcatal where codcia_cat=codcia_hed and
>> numcta_cat=numcta_det) as cuenta,
>> (select descri_act from actmaes where codcia_act=codcia_hed and
>> codart_act= substring(referen1_hed from 11 for 6)) as activo,
>>  (select descri_dep from actdepa where codcia_dep=codcia_hed and
>> coddep_dep=(select coddep_act from actmaes where codcia_act=codcia_hed and
>> codart_act= substring(referen1_hed from 11 for 6)) ) as departamento,
>>  (select descri_tip from acttipo where codcia_tip=codcia_hed and
>> tipact_tip=(select tipart_act from actmaes where codcia_act=codcia_hed and
>> codart_act= substring(referen1_hed from 11 for 6)))as tipo,
>>  (select coddep_act from actmaes where codcia_act=codcia_hed and
>> codart_act= substring(referen1_hed from 11 for 6)) as coddep_act,
>> (select tipart_act from actmaes where codcia_act=codcia_hed and
>> codart_act= substring(referen1_hed from 11 for 6)) as tipart_act
>>  FROM         cntdeta INNER JOIN
>>                       cnttran ON cntdeta.codcia_det = cnttran.codcia_hed
>> AND cntdeta.idTrand_det = cnttran.idTran_hed
>>  where modulo_hed='ACT' and codent_hed='C' and codcia_hed = codcia;
>>
>> end;
>> $BODY$
>>   LANGUAGE plpgsql VOLATILE
>>   COST 100;
>>
>> cuando la creo el resultado es: Query returned successfully with no
>> result in 13 ms.
>>
>> pero cuando la llamo:
>> select * from act_depre_cuentas('01');
>>
>> el resultado es:
>> ERROR: la lista de definición de columnas es obligatoria para funciones
>> que retornan «record»
>> SQL state: 42601
>> Character: 15
>>
>> He estado buscando en foros y me dicen que debo definir cada parámetro en
>> el RETURNS o crear un type personalizado con todos los registros que quiero
>> retornar.
>>
>> Hacer esto me tomaría muchísimo tiempo ya que tengo funciones que
>> retornan querys con muchísimas columnas.
>>
>> Mi pregunta es,¿Hay alguna forma de retornar el query sin tener que
>> definir todas las columnas??
>>
>
>
>
> --
> ISC Miguel Angel Hernandez Moreno
>

Responder a