음.. 제가 저번에 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개 썼네요.