※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を使うことはないので調べる気はないんですけど。