Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 число прописью  [new]
чтобы не забыть
Guest
with
a as (select 914767000873534524591281095.29663057631 num from dual),
nums as (
select 1 num, ' один' num_m, ' одна' num_f, ' одно' num_i, ' одиннадцать' teen, ' десять' ten, ' сто' hundr from dual
union all
select 2, ' два', ' две', ' два', ' двенадцать', ' двадцать', ' двести' from dual
union all
select 3, ' три', ' три', ' три', ' тринадцать', ' тридцать', ' триста' from dual
union all
select 4, ' четыре', ' четыре', ' четыре', ' четырнадцать', ' сорок', ' четыреста' from dual
union all
select 5, ' пять', ' пять', ' пять', ' пятьнадцать', ' пятьдесят', ' пятьсот' from dual
union all
select 6, ' шесть', ' шесть', ' шесть', ' шестьнадцать', ' шестьдесят', ' шестьсот' from dual
union all
select 7, ' семь', ' семь', ' семь', ' семнадцать', ' семьдесят', ' семьсот' from dual
union all
select 8, ' восемь', ' восемь', ' восемь', ' восемьнадцать', ' восемьдесят', ' восемьсот' from dual
union all
select 9, ' девять', ' девять', ' девять', ' девятнадцать', ' девяносто', ' девятьсот' from dual
),
pows as (
select 1 num, ' тысяча' power1, ' тысячи' power2, ' тысяч' power5, 'тысячная' power_1, 'тысячных' power_2 from dual
union all
select 2, ' миллион', ' миллиона', ' миллионов', 'миллионная', 'миллионных' from dual
union all
select 3, ' миллиард', ' миллиарда', ' миллиардов', 'миллиардная', 'миллиардных' from dual
union all
select 4, ' триллион', ' триллиона', ' триллионов', 'триллионная', 'триллионных' from dual
union all
select 5, ' квадриллион', ' квадриллиона', ' квадриллионов', 'квадриллионная', 'квадриллионных' from dual
union all
select 6, ' квинтиллион', ' квинтиллиона', ' квинтиллионов', 'квинтиллионная', 'квинтиллионных' from dual
union all
select 7, ' секстиллион', ' секстиллиона', ' секстиллионов', 'секстиллионная', 'секстиллионных' from dual
union all
select 8, ' септиллион', ' септиллиона', ' септиллионов', 'септиллионная', 'септиллионных' from dual
union all
select 9, ' октиллион', ' октиллиона', ' октиллионов', 'октиллионная', 'октиллионных' from dual
union all
select 10, ' нониллион', ' нониллиона', ' нониллионов', 'нониллионная', 'нониллионных' from dual
union all
select 11, ' дециллион', ' дециллиона', ' дециллионов', 'дециллионная', 'децилионных' from dual
),
b as (select floor(num) part1, to_number(substr(to_char(num-floor(num)),2)) part2, length(substr(to_char(num-floor(num)),2)) part2_len from a),
c as (
  select
   1 part,
   level-1 lvl,
   case when level-1=0 then 'Ы' when level-1=1 then 'F' else 'M' end s,
   mod(floor(part1/power(1000,level-1)),1000) trinum
  from b connect by level<=11
  union all
  select
   2 part,
   level-1 lvl,
   case when level-1=0 then 'F' when level-1=1 then 'F' else 'M' end s,
   mod(floor(part2/power(1000,level-1)),1000) trinum
  from b connect by level<=11
),
d as (
select part, lvl, s, trinum,
  case when trinum=0 then 0
       when mod(trinum,100) between 5 and 19 then 5
       when mod(trinum,10) between 2 and 4 then 2
       when mod(trinum,10)=1 then 1
       else 5
  end power
from c),
e as (
select
  row_number() over (order by d.part, d.lvl desc) rn
, h.hundr
  || case when t.num=1 and n.num>0 then n.teen else t.ten 
  || decode(d.s,'M',n.num_m,'F',n.num_f,n.num_i) end 
  || decode(d.power,1,p.power1,2,p.power2,5,p.power5)
  || case when d.part=1 and d.lvl=0 then
     (select ' ' || decode(d.power,1,decode(d.s,'M','целый','F','целая','целое'),2,'целых',5,'целых')
      from b where b.part2_len>0)
     end
  || case when d.part=2 and d.lvl=0 then
     (select ' ' ||
       case b.part2_len
        when 1 then decode(d.power,1,'десятая',2,'десятых',5,'десятых')
        when 2 then decode(d.power,1,'сотая',2,'сотых',5,'сотых')
        else decode(mod(b.part2_len,3),1,'десяти',2,'сто') || decode(d.power,1,m.power_1,2,m.power_2,5,m.power_2)
       end 
      from b
       left join pows m on m.num=floor(b.part2_len/3))
     end text
from d
  left join nums h on h.num=floor(d.trinum/100)
  left join nums t on t.num=mod(floor(d.trinum/10),10)
  left join nums n on n.num=mod(d.trinum,10)
  left join pows p on p.num=d.lvl)

select sys_xmlagg(xmlelement(col,text)).extract('ROWSET/COL/text()').getstringval() s
from e order by rn
22 дек 09, 22:22    [8104544]     Ответить | Цитировать Сообщить модератору
 Re: число прописью  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5930
Про Йобибайт то забыли!
22 дек 09, 22:25    [8104567]     Ответить | Цитировать Сообщить модератору
 Re: число прописью  [new]
чтобы не забыть
Guest
mcureenab,

спасибо, я учту =)
22 дек 09, 22:28    [8104575]     Ответить | Цитировать Сообщить модератору
 Re: число прописью  [new]
чтобы не забыть
Guest
with
a as (select 914760000873534524591281093.29663057635 num from dual),
nums as (
select 1 num, ' один' num_m, ' одна' num_f, ' одно' num_i, ' одиннадцать' teen, ' десять' ten, ' сто' hundr from dual
union all
select 2, ' два', ' две', ' два', ' двенадцать', ' двадцать', ' двести' from dual
union all
select 3, ' три', ' три', ' три', ' тринадцать', ' тридцать', ' триста' from dual
union all
select 4, ' четыре', ' четыре', ' четыре', ' четырнадцать', ' сорок', ' четыреста' from dual
union all
select 5, ' пять', ' пять', ' пять', ' пятьнадцать', ' пятьдесят', ' пятьсот' from dual
union all
select 6, ' шесть', ' шесть', ' шесть', ' шестьнадцать', ' шестьдесят', ' шестьсот' from dual
union all
select 7, ' семь', ' семь', ' семь', ' семнадцать', ' семьдесят', ' семьсот' from dual
union all
select 8, ' восемь', ' восемь', ' восемь', ' восемьнадцать', ' восемьдесят', ' восемьсот' from dual
union all
select 9, ' девять', ' девять', ' девять', ' девятнадцать', ' девяносто', ' девятьсот' from dual
),
pows as (
select 1 num, ' тысяча' power1, ' тысячи' power2, ' тысяч' power5, 'тысячная' power_1, 'тысячных' power_2 from dual
union all
select 2, ' миллион', ' миллиона', ' миллионов', 'миллионная', 'миллионных' from dual
union all
select 3, ' миллиард', ' миллиарда', ' миллиардов', 'миллиардная', 'миллиардных' from dual
union all
select 4, ' триллион', ' триллиона', ' триллионов', 'триллионная', 'триллионных' from dual
union all
select 5, ' квадриллион', ' квадриллиона', ' квадриллионов', 'квадриллионная', 'квадриллионных' from dual
union all
select 6, ' квинтиллион', ' квинтиллиона', ' квинтиллионов', 'квинтиллионная', 'квинтиллионных' from dual
union all
select 7, ' секстиллион', ' секстиллиона', ' секстиллионов', 'секстиллионная', 'секстиллионных' from dual
union all
select 8, ' септиллион', ' септиллиона', ' септиллионов', 'септиллионная', 'септиллионных' from dual
union all
select 9, ' октиллион', ' октиллиона', ' октиллионов', 'октиллионная', 'октиллионных' from dual
union all
select 10, ' нониллион', ' нониллиона', ' нониллионов', 'нониллионная', 'нониллионных' from dual
union all
select 11, ' дециллион', ' дециллиона', ' дециллионов', 'дециллионная', 'децилионных' from dual
),
sfx as (
select 1 num, 'целый' part1_m, 'целая' part1_f, 'целое' part1_i, 'десятая' part2_1, 'сотая' part2_2, 'десяти' part2_pow from dual
union all
select 2, 'целых', 'целых', 'целых', 'десятых', 'сотых', 'сто' from dual
union all
select 5, 'целых', 'целых', 'целых', 'десятых', 'сотых', '' from dual
),
b as (select floor(num) part1, to_number(substr(to_char(num-floor(num)),2)) part2, length(substr(to_char(num-floor(num)),2)) part2_len from a),
c as (
  select
   1 part,
   level-1 lvl,
   case when level-1=0 then 'Ы' when level-1=1 then 'F' else 'M' end s,
   mod(floor(part1/power(1000,level-1)),1000) trinum
  from b connect by level<=11
  union all
  select
   2 part,
   level-1 lvl,
   case when level-1=0 then 'F' when level-1=1 then 'F' else 'M' end s,
   mod(floor(part2/power(1000,level-1)),1000) trinum
  from b connect by level<=11
),
d as (
select part, lvl, s, trinum,
  case when trinum=0 then 0
       when mod(trinum,100) between 5 and 19 then 5
       when mod(trinum,10) between 2 and 4 then 2
       when mod(trinum,10)=1 then 1
       else 5
  end power
from c),
e as (
select
  row_number() over (order by d.part, d.lvl desc) rn
, h.hundr
  || case when t.num=1 and n.num>0 then n.teen else t.ten 
  || decode(d.s,'M',n.num_m,'F',n.num_f,n.num_i) end 
  || decode(d.power,1,p.power1,2,p.power2,5,p.power5)
  || case when d.part=1 and d.lvl=0 then
     (select ' ' || decode(d.s,'M',s.part1_m,'F',s.part1_f,s.part1_i)
      from b, sfx s
      where s.num(+)=d.power and b.part2_len>0)
     end
  || case when d.part=2 and d.lvl=0 then
     (select ' ' ||
       decode(b.part2_len,1,s1.part2_1,2,s1.part2_2,s2.part2_pow||decode(d.power,1,p.power_1,2,p.power_2,5,p.power_2))
      from b, pows p, sfx s1, sfx s2
      where p.num(+)=floor(b.part2_len/3) and s1.num(+)=d.power and s2.num(+)=mod(b.part2_len,3))
     end text
from d, nums h, nums t, nums n, pows p
where h.num(+)=floor(d.trinum/100)
  and t.num(+)=mod(floor(d.trinum/10),10)
  and n.num(+)=mod(d.trinum,10)
  and p.num(+)=d.lvl)

select sys_xmlagg(xmlelement(col,text)).extract('ROWSET/COL/text()').getstringval() text
from e order by rn
22 дек 09, 23:43    [8104706]     Ответить | Цитировать Сообщить модератору
 Re: число прописью  [new]
А по проще
Guest
with
a as (select 1 num from dual),
nums as (
...
 одно нониллионов октиллионов септиллионов секстиллионов квинтиллионов квадриллионов триллионов миллиардов миллионов тысяч
23 дек 09, 10:41    [8105563]     Ответить | Цитировать Сообщить модератору
 Re: число прописью  [new]
чтобы не забыть
Guest
А по проще,

спасибо большое. стратил таки на преобразовании в строку :(
b as (select floor(num) part1, nvl(to_number(substr(to_char(num-floor(num)),2)),0) part2, length(substr(to_char(num-floor(num)),2)) part2_len from a)
23 дек 09, 13:17    [8106959]     Ответить | Цитировать Сообщить модератору
 Re: число прописью  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
еще см. stff числа прописью
23 дек 09, 13:29    [8107057]     Ответить | Цитировать Сообщить модератору
 Re: число прописью  [new]
чтобы не забыть
Guest
orawish,

спасибо, я видел :)

последний вариант, исправлен ещё и 0

with
a as (select 0 num, 'I' sex from dual),
b as (select sex, floor(num) part1, nvl(to_number(substr(to_char(num-floor(num)),2)),0) part2, length(substr(to_char(num-floor(num)),2)) part2_len from a),
c as (
  select
   1 part,
   level-1 lvl,
   case when level-1=0 then sex when level-1=1 then 'F' else 'M' end s,
   mod(floor(part1/power(1000,level-1)),1000) trinum
  from b connect by level<=11
  union all
  select
   2 part,
   level-1 lvl,
   case when level-1=0 then 'F' when level-1=1 then 'F' else 'M' end s,
   mod(floor(part2/power(1000,level-1)),1000) trinum
  from b connect by level<=11),
d as (
select part, lvl, s, trinum,
  case when trinum=0 then 0
       when mod(trinum,100) between 5 and 19 then 5
       when mod(trinum,10) between 2 and 4 then 2
       when mod(trinum,10)=1 then 1
       else 5
  end power
from c),
nums as (
select 1 num, ' один' num_m, ' одна' num_f, ' одно' num_i, ' одиннадцать' teen, ' десять' ten, ' сто' hundr from dual
union all
select 2, ' два', ' две', ' два', ' двенадцать', ' двадцать', ' двести' from dual
union all
select 3, ' три', ' три', ' три', ' тринадцать', ' тридцать', ' триста' from dual
union all
select 4, ' четыре', ' четыре', ' четыре', ' четырнадцать', ' сорок', ' четыреста' from dual
union all
select 5, ' пять', ' пять', ' пять', ' пятьнадцать', ' пятьдесят', ' пятьсот' from dual
union all
select 6, ' шесть', ' шесть', ' шесть', ' шестьнадцать', ' шестьдесят', ' шестьсот' from dual
union all
select 7, ' семь', ' семь', ' семь', ' семнадцать', ' семьдесят', ' семьсот' from dual
union all
select 8, ' восемь', ' восемь', ' восемь', ' восемьнадцать', ' восемьдесят', ' восемьсот' from dual
union all
select 9, ' девять', ' девять', ' девять', ' девятнадцать', ' девяносто', ' девятьсот' from dual
),
pows as (
select 1 num, ' тысяча' power1, ' тысячи' power2, ' тысяч' power5, 'тысячная' power_1, 'тысячных' power_2 from dual
union all
select 2, ' миллион', ' миллиона', ' миллионов', 'миллионная', 'миллионных' from dual
union all
select 3, ' миллиард', ' миллиарда', ' миллиардов', 'миллиардная', 'миллиардных' from dual
union all
select 4, ' триллион', ' триллиона', ' триллионов', 'триллионная', 'триллионных' from dual
union all
select 5, ' квадриллион', ' квадриллиона', ' квадриллионов', 'квадриллионная', 'квадриллионных' from dual
union all
select 6, ' квинтиллион', ' квинтиллиона', ' квинтиллионов', 'квинтиллионная', 'квинтиллионных' from dual
union all
select 7, ' секстиллион', ' секстиллиона', ' секстиллионов', 'секстиллионная', 'секстиллионных' from dual
union all
select 8, ' септиллион', ' септиллиона', ' септиллионов', 'септиллионная', 'септиллионных' from dual
union all
select 9, ' октиллион', ' октиллиона', ' октиллионов', 'октиллионная', 'октиллионных' from dual
union all
select 10, ' нониллион', ' нониллиона', ' нониллионов', 'нониллионная', 'нониллионных' from dual
union all
select 11, ' дециллион', ' дециллиона', ' дециллионов', 'дециллионная', 'децилионных' from dual
),
sfx as (
select 1 num, 'целый' part1_m, 'целая' part1_f, 'целое' part1_i, 'десятая' part2_1, 'сотая' part2_2, 'десяти' part2_pow from dual
union all
select 2, 'целых', 'целых', 'целых', 'десятых', 'сотых', 'сто' from dual
union all
select 5, 'целых', 'целых', 'целых', 'десятых', 'сотых', '' from dual
),
e as (
select
  row_number() over (order by d.part, d.lvl desc) rn
, h.hundr
  || case when t.num=1 and n.num>0 then n.teen else t.ten 
  || decode(d.s,'M',n.num_m,'F',n.num_f,n.num_i) end 
  || decode(d.power,1,p.power1,2,p.power2,5,p.power5)
  || case when d.part=1 and d.lvl=0 then
     (select 'ноль' from a where num=0) ||
     (select ' ' || decode(d.s,'M',s.part1_m,'F',s.part1_f,s.part1_i)
      from b, sfx s
      where s.num(+)=d.power and b.part2_len>0)
     end 
  || case when d.part=2 and d.lvl=0 then
     (select ' ' ||
       decode(b.part2_len,1,s1.part2_1,2,s1.part2_2,s2.part2_pow||decode(d.power,1,p.power_1,2,p.power_2,5,p.power_2))
      from b, pows p, sfx s1, sfx s2
      where p.num(+)=floor(b.part2_len/3) and s1.num(+)=d.power and s2.num(+)=mod(b.part2_len,3))
     end text
from d, nums h, nums t, nums n, pows p
where h.num(+)=floor(d.trinum/100)
  and t.num(+)=mod(floor(d.trinum/10),10)
  and n.num(+)=mod(d.trinum,10)
  and p.num(+)=d.lvl)

select sys_xmlagg(xmlelement(col,text)).extract('ROWSET/COL/text()').getstringval() text
from e order by rn
23 дек 09, 16:34    [8108801]     Ответить | Цитировать Сообщить модератору
 Re: число прописью  [new]
soleil_mmc
Member

Откуда:
Сообщений: 49
with
a as (select -10 num, 'I' sex from dual),

резалт

нониллионов октиллионов септиллионов секстиллионов квинтиллионов квадриллионов триллионов миллиардов миллионов тысяч
23 дек 09, 16:59    [8109033]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: число прописью  [new]
Бакыт
Member

Откуда: Кыргызстан
Сообщений: 753
0.5
 пять десятых
20 мар 17, 21:39    [20315685]     Ответить | Цитировать Сообщить модератору
 Re: число прописью  [new]
efendi
Member

Откуда:
Сообщений: 126
Бакыт
0.5
 пять десятых

ага

2.5

два целых пять десятых
21 мар 17, 09:31    [20316230]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: число прописью  [new]
Kukharonok
Member

Откуда:
Сообщений: 1
Скорректировала:
with
a as (select 0.45569784114449877 num, 'M' sex from dual),
b as (select sex, floor(num) part1, nvl(to_number(substr(to_char(num-floor(num)),2)),0) part2, length(substr(to_char(num-floor(num)),2)) part2_len from a),
c as (
select
1 part,
level-1 lvl,
case when level-1=0 then sex when level-1=1 then 'F' else 'M' end s,
mod(floor(part1/power(1000,level-1)),1000) trinum
from b connect by level<=11
union all
select
2 part,
level-1 lvl,
case when level-1=0 then 'F' when level-1=1 then 'F' else 'M' end s,
mod(floor(part2/power(1000,level-1)),1000) trinum
from b connect by level<=11),
d as (
select part, lvl, s, trinum,
case when trinum=0 then 0
when mod(trinum,100) between 5 and 19 then 5
when mod(trinum,10) between 2 and 4 then 2
when mod(trinum,10)=1 then 1
else 5
end power
from c),
nums as (
select 1 num, ' один' num_m, ' одна' num_f, ' одно' num_i, ' одиннадцать' teen, ' десять' ten, ' сто' hundr from dual
union all
select 2, ' два', ' две', ' два', ' двенадцать', ' двадцать', ' двести' from dual
union all
select 3, ' три', ' три', ' три', ' тринадцать', ' тридцать', ' триста' from dual
union all
select 4, ' четыре', ' четыре', ' четыре', ' четырнадцать', ' сорок', ' четыреста' from dual
union all
select 5, ' пять', ' пять', ' пять', ' пятьнадцать', ' пятьдесят', ' пятьсот' from dual
union all
select 6, ' шесть', ' шесть', ' шесть', ' шестьнадцать', ' шестьдесят', ' шестьсот' from dual
union all
select 7, ' семь', ' семь', ' семь', ' семнадцать', ' семьдесят', ' семьсот' from dual
union all
select 8, ' восемь', ' восемь', ' восемь', ' восемьнадцать', ' восемьдесят', ' восемьсот' from dual
union all
select 9, ' девять', ' девять', ' девять', ' девятнадцать', ' девяносто', ' девятьсот' from dual
),
pows as (
select 1 num, ' тысяча' power1, ' тысячи' power2, ' тысяч' power5, 'тысячная' power_1, 'тысячных' power_2 from dual
union all
select 2, ' миллион', ' миллиона', ' миллионов', 'миллионная', 'миллионных' from dual
union all
select 3, ' миллиард', ' миллиарда', ' миллиардов', 'миллиардная', 'миллиардных' from dual
union all
select 4, ' триллион', ' триллиона', ' триллионов', 'триллионная', 'триллионных' from dual
union all
select 5, ' квадриллион', ' квадриллиона', ' квадриллионов', 'квадриллионная', 'квадриллионных' from dual
union all
select 6, ' квинтиллион', ' квинтиллиона', ' квинтиллионов', 'квинтиллионная', 'квинтиллионных' from dual
union all
select 7, ' секстиллион', ' секстиллиона', ' секстиллионов', 'секстиллионная', 'секстиллионных' from dual
union all
select 8, ' септиллион', ' септиллиона', ' септиллионов', 'септиллионная', 'септиллионных' from dual
union all
select 9, ' октиллион', ' октиллиона', ' октиллионов', 'октиллионная', 'октиллионных' from dual
union all
select 10, ' нониллион', ' нониллиона', ' нониллионов', 'нониллионная', 'нониллионных' from dual
union all
select 11, ' дециллион', ' дециллиона', ' дециллионов', 'дециллионная', 'децилионных' from dual
),
sfx as (
select 1 num, 'целый' part1_m, 'целая' part1_f, 'целое' part1_i, 'десятая' part2_1, 'сотая' part2_2, 'десяти' part2_pow from dual
union all
select 2, 'целых', 'целых', 'целых', 'десятых', 'сотых', 'сто' from dual
union all
select 5, 'целых', 'целых', 'целых', 'десятых', 'сотых', '' from dual
),
e as (
select
row_number() over (order by d.part, d.lvl desc) rn
, CASE WHEN d.part = 1 and d.lvl=0 AND d.trinum = 0 THEN 'ноль целых' END
|| h.hundr
|| case when t.num=1 and n.num>0 then n.teen else t.ten
|| decode(d.s,'M',n.num_m,'F',n.num_f,n.num_i) end
|| decode(d.power,1,p.power1,2,p.power2,5,p.power5)
|| case when d.part=1 and d.lvl=0 then
(select 'ноль' from a where num=0) ||
(select ' ' || decode(d.s,'M',s.part1_m,'F',s.part1_f,s.part1_i)
from b, sfx s
where s.num(+)=d.power and b.part2_len>0)
end
|| case when d.part=2 and d.lvl=0 then
(select ' ' ||
decode(b.part2_len,1,s1.part2_1,2,s1.part2_2,s2.part2_pow||decode(d.power,1,p.power_1,2,p.power_2,5,p.power_2))
from b, pows p, sfx s1, sfx s2
where p.num(+)=floor(b.part2_len/3) and s1.num(+)=d.power and s2.num(+)=mod(b.part2_len,3))
end text
from d, nums h, nums t, nums n, pows p
where h.num(+)=floor(d.trinum/100)
and t.num(+)=mod(floor(d.trinum/10),10)
and n.num(+)=mod(d.trinum,10)
and p.num(+)=d.lvl)

select sys_xmlagg(xmlelement(col,text)).extract('ROWSET/COL/text()').getstringval() text
from e order by rn

Спасибо за первоначальный селект!
22 ноя 20, 17:40    [22236606]     Ответить | Цитировать Сообщить модератору
 Re: число прописью  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8136
Kukharonok
Скорректировала:
with
a as (select 0.45569784114449877 num, 'M' sex from dual),
b as (select sex, floor(num) part1, nvl(to_number(substr(to_char(num-floor(num)),2)),0) part2
           , length(substr(to_char(num-floor(num)),2)) part2_len from a),
c as (
  select
   1 part,
   level-1 lvl,
   case when level-1=0 then sex when level-1=1 then 'F' else 'M' end s,
   mod(floor(part1/power(1000,level-1)),1000) trinum
  from b connect by level<=11
  union all
  select
   2 part,
   level-1 lvl,
   case when level-1=0 then 'F' when level-1=1 then 'F' else 'M' end s,
   mod(floor(part2/power(1000,level-1)),1000) trinum
  from b connect by level<=11),
d as (
select part, lvl, s, trinum,
  case when trinum=0 then 0
       when mod(trinum,100) between 5 and 19 then 5
       when mod(trinum,10) between 2 and 4 then 2
       when mod(trinum,10)=1 then 1
       else 5
  end power
from c),
nums as (
select 1 num, ' один' num_m, ' одна' num_f, ' одно' num_i, ' одиннадцать' teen, ' десять' ten, ' сто' hundr from dual
union all
select 2, ' два', ' две', ' два', ' двенадцать', ' двадцать', ' двести' from dual
union all
select 3, ' три', ' три', ' три', ' тринадцать', ' тридцать', ' триста' from dual
union all
select 4, ' четыре', ' четыре', ' четыре', ' четырнадцать', ' сорок', ' четыреста' from dual
union all
select 5, ' пять', ' пять', ' пять', ' пятьнадцать', ' пятьдесят', ' пятьсот' from dual
union all
select 6, ' шесть', ' шесть', ' шесть', ' шестьнадцать', ' шестьдесят', ' шестьсот' from dual
union all
select 7, ' семь', ' семь', ' семь', ' семнадцать', ' семьдесят', ' семьсот' from dual
union all
select 8, ' восемь', ' восемь', ' восемь', ' восемьнадцать', ' восемьдесят', ' восемьсот' from dual
union all
select 9, ' девять', ' девять', ' девять', ' девятнадцать', ' девяносто', ' девятьсот' from dual
),
pows as (
select 1 num, ' тысяча' power1, ' тысячи' power2, ' тысяч' power5, 'тысячная' power_1, 'тысячных' power_2 from dual
union all
select 2, ' миллион', ' миллиона', ' миллионов', 'миллионная', 'миллионных' from dual
union all
select 3, ' миллиард', ' миллиарда', ' миллиардов', 'миллиардная', 'миллиардных' from dual
union all
select 4, ' триллион', ' триллиона', ' триллионов', 'триллионная', 'триллионных' from dual
union all
select 5, ' квадриллион', ' квадриллиона', ' квадриллионов', 'квадриллионная', 'квадриллионных' from dual
union all
select 6, ' квинтиллион', ' квинтиллиона', ' квинтиллионов', 'квинтиллионная', 'квинтиллионных' from dual
union all
select 7, ' секстиллион', ' секстиллиона', ' секстиллионов', 'секстиллионная', 'секстиллионных' from dual
union all
select 8, ' септиллион', ' септиллиона', ' септиллионов', 'септиллионная', 'септиллионных' from dual
union all
select 9, ' октиллион', ' октиллиона', ' октиллионов', 'октиллионная', 'октиллионных' from dual
union all
select 10, ' нониллион', ' нониллиона', ' нониллионов', 'нониллионная', 'нониллионных' from dual
union all
select 11, ' дециллион', ' дециллиона', ' дециллионов', 'дециллионная', 'децилионных' from dual
),
sfx as (
select 1 num, 'целый' part1_m, 'целая' part1_f, 'целое' part1_i, 'десятая' part2_1, 'сотая' part2_2, 'десяти' part2_pow from dual
union all
select 2, 'целых', 'целых', 'целых', 'десятых', 'сотых', 'сто' from dual
union all
select 5, 'целых', 'целых', 'целых', 'десятых', 'сотых', '' from dual
),
e as (
select
  row_number() over (order by d.part, d.lvl desc) rn
, CASE WHEN d.part = 1 and d.lvl=0 AND d.trinum = 0 THEN 'ноль целых' END 
  || h.hundr
  || case when t.num=1 and n.num>0 then n.teen else t.ten 
  || decode(d.s,'M',n.num_m,'F',n.num_f,n.num_i) end 
  || decode(d.power,1,p.power1,2,p.power2,5,p.power5)
  || case when d.part=1 and d.lvl=0 then
     (select 'ноль' from a where num=0) ||
     (select ' ' || decode(d.s,'M',s.part1_m,'F',s.part1_f,s.part1_i)
      from b, sfx s
      where s.num(+)=d.power and b.part2_len>0)
     end 
  || case when d.part=2 and d.lvl=0 then
     (select ' ' ||
       decode(b.part2_len,1,s1.part2_1,2,s1.part2_2,s2.part2_pow||decode(d.power,1,p.power_1,2,p.power_2,5,p.power_2))
      from b, pows p, sfx s1, sfx s2
      where p.num(+)=floor(b.part2_len/3) and s1.num(+)=d.power and s2.num(+)=mod(b.part2_len,3))
     end text
from d, nums h, nums t, nums n, pows p
where h.num(+)=floor(d.trinum/100)
  and t.num(+)=mod(floor(d.trinum/10),10)
  and n.num(+)=mod(d.trinum,10)
  and p.num(+)=d.lvl)
select sys_xmlagg(xmlelement(col,text)).extract('ROWSET/COL/text()').getstringval() text
from e order by rn

Спасибо за первоначальный селект!

Для оформления кода используйте, пожалуйста, тэг SRC.
22 ноя 20, 20:11    [22236676]     Ответить | Цитировать Сообщить модератору
 Re: число прописью  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54398
зачем нужна процедура на албанском йезыке?

К сообщению приложен файл. Размер - 25Kb
24 ноя 20, 14:12    [22237841]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить