Oraclub in Tomsk

 Oraclub Tomsk . . Хранимая функции для вывода числа прописью

ХРАНИМАЯ ФУНКЦИИ ДЛЯ ВЫВОДА ЧИСЛА ПРОПИСЬЮ

FUNCTION SUM_TO_TEXT (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 floor(mod(n,100))>10 and floor(mod(n,100))<20 then
              c:=r(0).a||c;
              c:=m11(floor(mod(n,10)))||c;
      else
              c:=r(floor(mod(n,10))).a||c;
              if i=2 then
                      c:=m1a(floor(mod(n,10)))||c;                   
              else
                      c:=m1(floor(mod(n,10)))||c;
              end if;
              c:=m10(floor(mod(trunc(n/10,0),10)))||c;
      end if;
              c:=m100(floor(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;


UTILITY > Хранимая функции для вывода числа прописью >
Oraclub_Tomsk | News | Links | FAQ | DOC | Статьи | Utility | Software | ФОРУМ |  Обратная связь
Пишите на адрес : oraclub@ngs.ru