
CREATE OR REPLACE FUNCTION RIVUS.TO_FULL_KANA(
P_SOURCE_STR VARCHAR2,
P_TO_CHARSET VARCHAR2 :='HIRA'
)
RETURN VARCHAR2
IS
/*********************************************************************/
-- $Id: to_full_kana.sql,v 1.1 2005/06/18 00:11:59 rivus Exp $
-- ¥¹¥¯¥ê¥×¥È̾ ¡§TO_FULL_KANA
-- ¥Ñ¥é¥á¡¼¥¿ ¡§(I ) P_SOURCE_STR ÊÑ´¹Ê¸»úÎó
-- ¡§(I ) P_TO_CHARSET ÊÑ´¹¥¥ã¥é¥¯¥¿¥»¥Ã¥È
-- Ìá¤êÃÍ ¡§ÊÑ´¹¸å¤Îʸ»úÎó
-- ÆÃµ»ö¹à ¡§ÆþÎϤª¤è¤Ó½ÐÎÏ·ë²Ìʸ»úÎóĹ¤Ï 2000 ¥Ð¥¤¥È¤Þ¤Ç
/*********************************************************************/
TYPE CHAR_MAP_T IS TABLE OF VARCHAR2(30);
-- Ⱦ³Ñ¥«¥¿¥«¥Ê(ËÜÍè¤ÏȾ³Ñ¥«¥Ê¤Ç¤¹¤¬¡¢¤¹¤Ù¤ÆÁ´³Ñ¤Ë¤·¤Æ¤¢¤ê¤Þ¤¹)
HANDAKU_KANA_HALF CHAR_MAP_T := CHAR_MAP_T(
'¥Ñ', '¥Ô', '¥×', '¥Ú', '¥Ý','¡¬'
);
DAKU_KANA_HALF CHAR_MAP_T := CHAR_MAP_T(
'¥¬', '¥®', '¥°', '¥²', '¥´',
'¥¶', '¥¸', '¥º', '¥¼', '¥¾',
'¥À', '¥Â', '¥Å', '¥Ç', '¥É',
'¥Ð', '¥Ó', '¥Ö', '¥Ù', '¥Ü',
'¥ô', '¡«'
);
KANA_HALF CHAR_MAP_T := CHAR_MAP_T(
'¥¢¥¤¥¦¥¨¥ª', '¥«¥¥¯¥±¥³', '¥µ¥·¥¹¥»¥½', '¥¿¥Á¥Ä¥Æ¥È', '¥Ê¥Ë¥Ì¥Í¥Î',
'¥Ï¥Ò¥Õ¥Ø¥Û', '¥Þ¥ß¥à¥á¥â', '¥ä¥æ¥è', '¥é¥ê¥ë¥ì¥í', '¥ï¥ò¥ó',
'¥¡¥£¥¥¥§¥©', '¥Ã¥ã¥å¥ç¡¼', '¥¤¥¤¥¨¥«¥±'
);
-- Á´³Ñ¤Ò¤é¤¬¤Ê
HANDAKU_HIRA_FULL CHAR_MAP_T := CHAR_MAP_T(
'¤Ñ', '¤Ô', '¤×', '¤Ú' ,'¤Ý', '¡¬'
);
DAKU_HIRA_FULL CHAR_MAP_T := CHAR_MAP_T(
'¤¬', '¤®', '¤°', '¤²', '¤´',
'¤¶', '¤¸', '¤º', '¤¼', '¤¾',
'¤À', '¤Â', '¤Å', '¤Ç', '¤É',
'¤Ð', '¤Ó', '¤Ö', '¤Ù', '¤Ü',
'¤¦¡«', '¡«'
);
HIRA_FULL CHAR_MAP_T := CHAR_MAP_T(
'¤¢¤¤¤¦¤¨¤ª', '¤«¤¤¯¤±¤³', '¤µ¤·¤¹¤»¤½', '¤¿¤Á¤Ä¤Æ¤È', '¤Ê¤Ë¤Ì¤Í¤Î',
'¤Ï¤Ò¤Õ¤Ø¤Û', '¤Þ¤ß¤à¤á¤â', '¤ä¤æ¤è', '¤é¤ê¤ë¤ì¤í', '¤ï¤ò¤ó',
'¤¡¤£¤¥¤§¤©', '¤Ã¤ã¤å¤ç¡¼', '¥ð¤ð¤ñ¥õ¥ö'
);
-- Á´³Ñ¥«¥¿¥«¥Ê
HANDAKU_KANA_FULL CHAR_MAP_T := CHAR_MAP_T(
'¥Ñ', '¥Ô', '¥×', '¥Ú', '¥Ý','¡¬'
);
DAKU_KANA_FULL CHAR_MAP_T := CHAR_MAP_T(
'¥¬', '¥®', '¥°', '¥²', '¥´',
'¥¶', '¥¸', '¥º', '¥¼', '¥¾',
'¥À', '¥Â', '¥Å', '¥Ç', '¥É',
'¥Ð', '¥Ó', '¥Ö', '¥Ù', '¥Ü',
'¥ô', '¡«'
);
KANA_FULL CHAR_MAP_T := CHAR_MAP_T(
'¥¢¥¤¥¦¥¨¥ª', '¥«¥¥¯¥±¥³', '¥µ¥·¥¹¥»¥½', '¥¿¥Á¥Ä¥Æ¥È', '¥Ê¥Ë¥Ì¥Í¥Î',
'¥Ï¥Ò¥Õ¥Ø¥Û', '¥Þ¥ß¥à¥á¥â', '¥ä¥æ¥è', '¥é¥ê¥ë¥ì¥í', '¥ï¥ò¥ó',
'¥¡¥£¥¥¥§¥©', '¥Ã¥ã¥å¥ç¡¼', '¥¤¥¤¥¨¥õ¥ö'
);
vKANA_HIRA VARCHAR2(10);
vOUT_STR VARCHAR2(2000);
PROCEDURE ONE_BY_ONE(
P_STR IN OUT VARCHAR2
,P_SRCMAP CHAR_MAP_T
,P_DSTMAP CHAR_MAP_T
)
IS
BEGIN
FOR i IN 1..P_SRCMAP.COUNT
LOOP
P_STR := REPLACE(P_STR, P_SRCMAP(i), P_DSTMAP(i));
END LOOP;
END;
BEGIN
vKANA_HIRA := UPPER(P_TO_CHARSET);
vOUT_STR := P_SOURCE_STR;
IF (INSTR(vOUT_STR,'¡¬') != 0) THEN
IF (vKANA_HIRA = 'HIRA') THEN
ONE_BY_ONE(vOUT_STR, HANDAKU_KANA_HALF, HANDAKU_HIRA_FULL);
ELSE
ONE_BY_ONE(vOUT_STR, HANDAKU_KANA_HALF, HANDAKU_KANA_FULL);
END IF;
END IF;
IF (INSTR(vOUT_STR,'¡«') != 0) THEN
IF (vKANA_HIRA = 'HIRA') THEN
ONE_BY_ONE(vOUT_STR, DAKU_KANA_HALF, DAKU_HIRA_FULL);
ELSE
ONE_BY_ONE(vOUT_STR, DAKU_KANA_HALF, DAKU_KANA_FULL);
END IF;
END IF;
FOR i IN 1..KANA_HALF.COUNT
LOOP
IF (vKANA_HIRA = 'HIRA') THEN
vOUT_STR := TRANSLATE(vOUT_STR, KANA_HALF(i), HIRA_FULL(i));
ELSE
vOUT_STR := TRANSLATE(vOUT_STR, KANA_HALF(i), KANA_FULL(i));
END IF;
END LOOP;
RETURN vOUT_STR;
END;
/