Hola,
Esta sería una opción sin hacer llamada recursiva:

CREATE OR REPLACE FUNCTION public.reversa
(
  IN  origen  integer
)
RETURNS integer AS
$$
DECLARE
  resultado integer;
BEGIN
  resultado := 0;
  WHILE (origen > 0)
  LOOP
    resultado := (resultado * 10) + (origen % 10);
    origen := origen / 10;
  END LOOP;
  return resultado;
END;
$$
LANGUAGE 'plpgsql';

Un saludo.

El 26 de agosto de 2016, 3:13, Daymel Bonne Solís <daymelbo...@gmail.com>
escribió:

> Hola Carlos:
>
> Aquí un ejemplo. Usando una simple función recursiva:
>
> CREATE OR REPLACE FUNCTION reverse_order(var int8, rest int8)
>   RETURNS pg_catalog.int8 AS
> $BODY$
> DECLARE
>   inverted int8;
> BEGIN
> if var=0 then
> inverted:=rest;
> else
> inverted:=reverse_order(var/10, rest * 10 + var % 10);
> end if;
> return inverted;
> END
> $BODY$
>   LANGUAGE 'plpgsql' VOLATILE COST 100
> ;
>
> select public.reverse_order(1589,0);
>
> Saludos
>
> El jue., 25 ago. 2016 a las 19:43, Carlos T. Groero Carmona (<
> cton...@gmail.com>) escribió:
>
>> Hola lista, ante todo gracias por cualquier comentario o sugerencia...
>> Tengo esta función que tiene como parámetro de entrada un número, y luego
>> devuelve ese número invertido...ejemplo...entro el 531 y tiene que devolver
>> el 135, la función o ejercicio tiene como principal características que no
>> puedo usar ningún tipo de función o tipo de dato para cadena...solo puedo
>> usar tipos de datos y funciones numéricas...ya la hice...y cuando la
>> debugeo me funciona bien, pero cuando la ejecuto me devuelve este error:
>>
>> ERROR:  invalid input syntax for integer: "31.0000000000000000"
>> CONTEXT:  PL/pgSQL function some_user.reverse_order(integer) line 18 at
>> assignment
>>
>> la función es la siguiente...
>>
>> CREATE OR REPLACE FUNCTION some_user.reverse_order (
>>   var integer
>> )
>> RETURNS integer AS'
>> DECLARE
>> var_lgh integer ;
>> var_div integer :=$1::integer;
>> var_s integer :=1;
>> result_e integer:=0;
>> tf BOOLEAN := true;
>> var_x integer;
>> lth integer :=trunc(log($1))+1;
>> -- variable_name datatype;
>> BEGIN
>> if $1>0 then
>>     BEGIN
>>             WHILE tf LOOP
>>             var_x:=lth-var_s;
>>                 var_lgh:=div(var_div,power(10.0,var_x)); -- dividendo
>>                 result_e:=result_e+var_lgh*power(10,var_s-1);
>>                 var_div:=mod(var_div,power(10.0,var_x)); -- resto
>>
>>                 var_s:=var_s+1;
>>                 IF var_s>lth THEN
>>                 tf:=false;
>>                 end if;
>>             END loop;
>>         END;
>> ELSE
>>     IF $1=0 THEN
>>     RAISE NOTICE ''The entered parameter is zero, please provide a
>> greater than zero value.'';
>>         ELSE
>>         RAISE EXCEPTION ''The entered parameter is less than zero,
>> please provide a greater than zero value.'';
>>         end if;
>>    end if;
>>  return result_e::integer;
>> END;
>> 'LANGUAGE 'plpgsql'
>> VOLATILE
>> CALLED ON NULL INPUT
>> SECURITY INVOKER
>> COST 100;
>>
>> una vez más gracias por cualquier comentario...
>>
>> Carlos
>>
>

Responder a