음.. 제가 저번에 PL/SQL 로 짠거 두번째 버전 올려드렷었는데요.
그건 맘에 안드시나요?
첫번째 버전은 SQL 성격이 강해서
두번째 버전은 절차적으로 풀어드렸었는데요.
두번째 버전이 원하시는 PL/SQL 일듯 합니다만...
그리고 예전 퀴즈낸거 보시면 정규식을 이용한 SQL버전도 있구요.
http://www.gurubee.net/article/58425
질문에 대한 답을 할때 보통 최선의 방법을 찾아 알려드리곤 하는데.
최선의 방법이 아닌걸 요구하실땐 참 난감합니다.
원하시는걸 도와드릴려면 원하시는게 뭔지 정확히 알아야 하는데.
그부분도 명확하지 않구요.
본인이 원하시는것 말고... 이건 지금 불명확합니다.
숙제를 주신분이 내주신 숙제를 토시 하나 틀리지 않고 그대로 옮겨줘 보실래요?
WITH t AS
(
SELECT 1 pk, 12345678 amt FROM dual
UNION ALL SELECT 2, 1234567890 amt FROM dual
)
-- 3단계 모두 모아 붙이고, 숫자를 한글로 변환
SELECT pk, amt
, TRANSLATE(
XMLAGG(XMLELEMENT(z, x, s) ORDER BY c).Extract('//text()').getStringVal()
, '1234567890', '일이삼사오육칠팔구'
) || '원' v
FROM (-- 2단계 4개씩 묶어서 조억만 붙이기
SELECT pk, amt
, c
, XMLAGG(XMLELEMENT(z, x, s) ORDER BY lv).Extract('//text()').getStringVal() x
, SUBSTR('조억만', c, 1) s
FROM (-- 1단계. 16개로 쪼개 천백십 붙이기
SELECT pk, amt
, lv
, SUBSTR(v, lv, 1) x
, CEIL(lv / 4) c
, SUBSTR('천백십', MOD(lv-1, 4)+1, 1) s
FROM (SELECT pk, amt, LPAD(amt, 16, '0') v FROM t)
, (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 16)
WHERE SUBSTR(v, lv, 1) != '0'
)
GROUP BY pk, amt, c
)
GROUP BY pk, amt
ORDER BY pk
;
-- 대량의 Substr 을 사용한 쿼리보다, 이 쿼리가 더 좋아보일수는 있습니다.
-- 그러나 어느정도 내공이 더 쌓인다면 데이터를 쪼갰다가 붙이는
-- 이 과정이 얼마나 부하가 심해질지 알게 될 것입니다.
-- 차라리 투박하더라도 Substr 여러번 사용한게 성능상 더 좋습니다.
-- 그래봤자 자리수가 무한 늘어나는것도 아니고 고작 Substr 32개 썼네요.