Hosted by uCoz
Функция для вывода суммы прописью (А.Токарь.)
 
	   
	   
	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;