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 >> >