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;
/