SELECT LISTAGG(STR) within GROUP(
ORDER BY ord desc)
FROM (SELECT case when instr(:1,'.') = 0 then LEVEL
else LEVEL - (length(:1) - instr(:1,'.') + 1)
end ord,
case substr(:1, LEVEL * -1, 1)
WHEN '1' THEN '壹'
WHEN '2' THEN '贰'
WHEN '3' then '叁'
WHEN '4' THEN '肆'
WHEN '5' THEN '伍'
WHEN '6' THEN '陆'
WHEN '7' THEN '柒'
WHEN '8' THEN '捌'
WHEN '9' THEN '玖'
WHEN '0' THEN '零'
else '' end ||
CASE case when instr(:1,'.') = 0 then rownum
else rownum - (length(:1) - instr(:1,'.') + 1) end
WHEN -2 THEN '分'
WHEN -1 THEN '角'
--WHEN 0 THEN '圆'
WHEN 1 THEN '圆'
WHEN 2 THEN '拾'
WHEN 3 THEN '佰'
WHEN 4 THEN '仟'
WHEN 5 THEN '萬'
WHEN 6 THEN '拾'
WHEN 7 THEN '佰'
WHEN 8 THEN '仟'
WHEN 9 THEN '亿'
WHEN 10 THEN '拾'
WHEN 11 THEN '佰'
WHEN 12 THEN '仟'
WHEN 13 THEN '萬'
WHEN 14 THEN '拾'
WHEN 15 THEN '佰'
WHEN 16 THEN '仟'
ELSE '' end STR
FROM dual CONNECT BY LEVEL <= length(:1));