※2011.12.26 追記 最近のバージョンでは標準で用意されてるようです。コメントで教えて頂きました。
わかりやすさを優先してストアドファンクションにしていますが、パッケージにして、静的な変数を使ったほうが当然パフォーマンスはあがると思います。これは、Oracle9iで動くことは確認しました。
全角のアルファベット、数字を半角にする
CREATE OR REPLACE FUNCTION alnum2han(str in VARCHAR2) RETURN VARCHAR2
IS
tmp varchar2(2000);
BEGIN
tmp := translate(
str,
'1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
'1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
);
RETURN tmp;
END alnum2han;
/
select alnum2han('1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz') from dual;
全角のアルファベット、数字を半角にして、半角カナを全角にして、他の記号もいい感じにする
CREATE OR REPLACE FUNCTION hanzen(str in VARCHAR2) RETURN VARCHAR2
IS
tmp varchar2(2000);
BEGIN
tmp := alnum2han(han2zen(str));
tmp := translate(
tmp,
'|=+?/@!”’#$%&;: ',
'|=+-/@!"''#$%&;: '
);
RETURN tmp;
END hanzen;
/
select hanzen(' ィァァィ<><>;:”()=!%$#’アイウエオカ|=+?/@!”’#$%&();:[]【】〔〕<>¥^キクケコザズゾざずぞザズダド1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz') from dual;
TO_SINGLE_BYTE
TO_MULTI_BYTE
UTL_I18N.TRANSLITERATE
では?
この記事はOracle9iの頃の話なんです。最近のバージョンはそういうのがあるんですね。もうOracleを使うことはないので調べる気はないんですけど。