В практической жизни для печати различных документов полезна функция преобразования числа в строку, где число указано словами. Ниже приведен пример решения этой задачи на Oracle для чисел меньших миллиона. При желании диапазон чисел легко расширить до необходимого значения. Переписать код для другой СУБД также не представляет никакой сложности. Возможно можно и проще, но привожу, что первое пришло в голову.
-- таблица сопоставления чисел и строкcreate table numbers(n integer,gender integer, str varchar(20), CONSTRAINT pk_numbers PRIMARY KEY (n,gender)); /*0 - без разницы какой род1 - мужской род2 - женский род3 - средний род*/ insert into numbers values(0, 0,'ноль');insert into numbers values(1, 1,'один');insert into numbers values(1, 2,'одна');insert into numbers values(1, 3,'одно');insert into numbers values(2, 1,'два');insert into numbers values(2, 2,'две');insert into numbers values(3, 0,'три');insert into numbers values(4, 0,'четыре');insert into numbers values(5, 0,'пять');insert into numbers values(6, 0,'шесть');insert into numbers values(7, 0,'семь');...insert into numbers values(19, 0,'девятнадцать'); insert into numbers values(20, 0,'двадцать');insert into numbers values(30, 0,'тридцать');...insert into numbers values(90, 0,'девяносто'); insert into numbers values(100, 0,'сто');insert into numbers values(200, 0,'двести');...insert into numbers values(900, 0,'девятьсот'); insert into numbers values(1000, 0,'тысяча');insert into numbers values(4000, 0,'тысячи');insert into numbers values(5000, 0,'тысяч');commit; -- сохраняет в r число до 100 прописью create or replace procedure n100_inwords(an integer, ag in integer,r out varchar) is tmp integer:=0; st varchar(255);begin -- числа меньшие 20 if an < 20 then select t.str into r from numbers t where t.n=an and (t.gender=ag or t.gender=0 ); else tmp:=mod(an,10); if tmp !=0 then -- единицы select t.str into st from numbers t where t.n=tmp and (t.gender=ag or t.gender=0); end if; -- десятки tmp:= an-tmp; select t.str into r from numbers t where t.n=tmp and (t.gender=ag or t.gender=0); r:=r||' '||st; end if; end n100_inwords; -- сохраняет в r число до 1000 прописью create or replace procedure n1000_inwords(an integer, ag in integer, r out varchar) is tmp integer; st varchar(255);begin tmp:= mod(an,100); if tmp!=0 or (tmp=0 and an=0) then n100_inwords(tmp,ag,st); end if; -- сотни tmp:=an-tmp; if tmp>0 then select t.str into r from numbers t where t.n=tmp and (t.gender=ag or t.gender=0); r:=r||' '||st; else r:=st; end if; end n1000_inwords; -- сохраняет в r число до 1000000 прописью create or replace procedure n1000000_inwords(an in integer, ag in integer, r out varchar) is tmp integer; tmp1 integer; st varchar(255);begin tmp:= mod(an,1000); if tmp>0 or (tmp=0 and an/1000=0) then n1000_inwords(tmp,ag,r); else r:=''; end if; -- тысячи tmp:=an-tmp; if tmp>0 then tmp1:= mod(tmp,10000); select t.str into st from numbers t where (t.n=1000 and tmp1=1000) or (t.n>1000 and t.n < =4000 and tmp1>1000 and tmp1 < =4000) or (t.n>=5000 and (tmp1>=5000 or tmp1=0)); r:=st||' '||r; tmp:=tmp / 1000; n1000_inwords(tmp,2,st); r:=st||' '||r; end if; end n1000000_inwords; -- возвращает строку - число до 1000000 прописью create or replace function int_inwords(n in integer, g in integer) return varchar2 is r varchar2(255);begin n1000000_inwords(n,g,r); return r;end int_inwords; -- проверкаselect int_inwords(815334,1)||' руб. '|| int_inwords(32,2)||' коп.' as summa from dual