FUNCTION sum2str(v_sum number) RETURN varchar2 IS
-- Сумма прописью /Alexander A. Tokar 2000/
type mass is table of varchar2(13)
index by binary_integer;
type rec is record (
a varchar2(12),
b varchar2(12),
c varchar2(12),
d varchar2(12),
e varchar2(12));
type razr is table of rec
index by binary_integer;
m1 mass;
m1a mass;
m11 mass;
m10 mass;
m100 mass;
r razr;
c varchar2(255);
n number;
i number;
again boolean;
BEGIN
--********************************** Заполняем массивы данными
-- массив 1 разряда (разряды с конца)
m1(0):='';
m1(1):='один ';
m1(2):='два ';
m1(3):='три ';
m1(4):='четыре ';
m1(5):='пять ';
m1(6):='шесть ';
m1(7):='семь ';
m1(8):='восемь ';
m1(9):='девять ';
-- массив 1 разряда для тысяч
m1a(0):='';
m1a(1):='одна ';
m1a(2):='две ';
m1a(3):='три ';
m1a(4):='четыре ';
m1a(5):='пять ';
m1a(6):='шесть ';
m1a(7):='семь ';
m1a(8):='восемь ';
m1a(9):='девять ';
-- массив 1 и 2 разрядов для чисел от 11 до 19
m11(0):='';
m11(1):='одиннадцать ';
m11(2):='двенадцать ';
m11(3):='тринадцать ';
m11(4):='четырнадцать ';
m11(5):='пятнадцать ';
m11(6):='шестнадцать ';
m11(7):='семнадцать ';
m11(8):='восемнадцать ';
m11(9):='девятнадцать ';
-- массив 2 разряда
m10(0):='';
m10(1):='десять ';
m10(2):='двадцать ';
m10(3):='тридцать ';
m10(4):='сорок ';
m10(5):='пятьдесят ';
m10(6):='шестьдесят ';
m10(7):='семьдесят ';
m10(8):='восемьдесят ';
m10(9):='девяносто ';
-- массив 3 разряда
m100(0):='';
m100(1):='сто ';
m100(2):='двести ';
m100(3):='триста ';
m100(4):='четыреста ';
m100(5):='пятьсот ';
m100(6):='шестьсот ';
m100(7):='семьсот ';
m100(8):='восемьсот ';
m100(9):='девятьсот ';
-- массив перед 1 разрядом
r(0).a:='тенге ';
r(1).a:='тенге ';
r(2).a:='тенге ';
r(3).a:='тенге ';
r(4).a:='тенге ';
r(5).a:='тенге ';
r(6).a:='тенге ';
r(7).a:='тенге ';
r(8).a:='тенге ';
r(9).a:='тенге ';
-- массив перед 4 разрядом
r(0).b:='тысяч ';
r(1).b:='тысяча ';
r(2).b:='тысячи ';
r(3).b:='тысячи ';
r(4).b:='тысячи ';
r(5).b:='тысяч ';
r(6).b:='тысяч ';
r(7).b:='тысяч ';
r(8).b:='тысяч ';
r(9).b:='тысяч ';
-- массив перед 7 разрядом
r(0).c:='миллионов ';
r(1).c:='миллион ';
r(2).c:='миллиона ';
r(3).c:='миллиона ';
r(4).c:='миллиона ';
r(5).c:='миллионов ';
r(6).c:='миллионов ';
r(7).c:='миллионов ';
r(8).c:='миллионов ';
r(9).c:='миллионов ';
-- массив перед 10 разрядом
r(0).d:='миллиардов ';
r(1).d:='миллиард ';
r(2).d:='миллиарда ';
r(3).d:='миллиарда ';
r(4).d:='миллиарда ';
r(5).d:='миллиардов ';
r(6).d:='миллиардов ';
r(7).d:='миллиардов ';
r(8).d:='миллиардов ';
r(9).d:='миллиардов ';
-- массив перед любым разрядом если он пустой
r(0).e:='';
r(1).e:='';
r(2).e:='';
r(3).e:='';
r(4).e:='';
r(5).e:='';
r(6).e:='';
r(7).e:='';
r(8).e:='';
r(9).e:='';
-- ************************************* Печатаем копейки
n:=round(v_sum,2);
c := substr(to_char(n,'999999999999999999.99'),
length(to_char(n,'999999999999999999.99'))-1,2)||' тиын';
-- ************************************* Печатаем сумму
i:=1;
again:=true;
while again loop
if mod(n,100)>10 and mod(n,100)<20 then
c:=r(0).a||c;
c:=m11(mod(n,10))||c;
else
c:=r(mod(n,10)).a||c;
if i=2 then
c:=m1a(mod(n,10))||c;
else
c:=m1(mod(n,10))||c;
end if;
c:=m10(mod(trunc(n/10,0),10))||c;
end if;
c:=m100(mod(trunc(n/100,0),10))||c;
n:=trunc(n/1000,0);
if n=0 then
again:=false;
end if;
for j in 0..9 loop
if i=1 then
r(j).a:=r(j).b;
end if;
if i=2 then
r(j).a:=r(j).c;
end if;
if i=3 then
r(j).a:=r(j).d;
end if;
if mod(n,1000)=0 then
r(j).a:=r(j).e;
end if;
end loop;
i:=i+1;
end loop;
return(upper(substr(c,1,1))||substr(c,2,length(c)-1));
END;