# Oracle 汉字转换首字母函数

CREATE OR REPLACE FUNCTION FNC_CWIT_GET_PYM
                          (iv_str IN CHAR)
  RETURN VARCHAR2
  IS
  v_frmstr           VARCHAR2(100) := '()【】:孢呋羟西漯';
  v_tostr            VARCHAR2(100) := '()[]:包福枪洗罗';
  i_pos              INTEGER;
  lv_ch              VARCHAR2(100);
  lv_retstr          VARCHAR2(1000);
BEGIN
  --依次处理v_str中每个字符
  FOR i IN 1..LENGTH(iv_str)
  LOOP
    lv_ch := SUBSTR(iv_str , i , 1);

    IF ASCII(lv_ch) < 128 THEN--非汉字
      lv_retstr := lv_retstr || lv_ch;
    ELSE--是汉字
      i_pos := INSTR(v_frmstr, lv_ch);
      IF i_pos > 0 THEN
        lv_ch := SUBSTR(v_tostr, i_pos, 1);
      END IF;

      lv_retstr := CASE lv_ch
                   WHEN GREATEST(lv_ch, '匝') THEN lv_retstr || 'Z'
                   WHEN GREATEST(lv_ch, '丫') THEN lv_retstr || 'Y'
                   WHEN GREATEST(lv_ch, '夕') THEN lv_retstr || 'X'
                   WHEN GREATEST(lv_ch, '哇') THEN lv_retstr || 'W'
                   WHEN GREATEST(lv_ch, '他') THEN lv_retstr || 'T'
                   WHEN GREATEST(lv_ch, '撒') THEN lv_retstr || 'S'
                   WHEN GREATEST(lv_ch, '然') THEN lv_retstr || 'R'
                   WHEN GREATEST(lv_ch, '七') THEN lv_retstr || 'Q'
                   WHEN GREATEST(lv_ch, '趴') THEN lv_retstr || 'P'
                   WHEN GREATEST(lv_ch, '哦') THEN lv_retstr || 'O'
                   WHEN GREATEST(lv_ch, '拿') THEN lv_retstr || 'N'
                   WHEN GREATEST(lv_ch, '妈') THEN lv_retstr || 'M'
                   WHEN GREATEST(lv_ch, '廓') THEN lv_retstr || 'L'
                   WHEN GREATEST(lv_ch, '咖') THEN lv_retstr || 'K'
                   WHEN GREATEST(lv_ch, '讥') THEN lv_retstr || 'J'
                   WHEN GREATEST(lv_ch, '哈') THEN lv_retstr || 'H'
                   WHEN GREATEST(lv_ch, '嘎') THEN lv_retstr || 'G'
                   WHEN GREATEST(lv_ch, '发') THEN lv_retstr || 'F'
                   WHEN GREATEST(lv_ch, '讹') THEN lv_retstr || 'E'
                   WHEN GREATEST(lv_ch, '搭') THEN lv_retstr || 'D'
                   WHEN GREATEST(lv_ch, '擦') THEN lv_retstr || 'C'
                   WHEN GREATEST(lv_ch, '八') THEN lv_retstr || 'B'
                   WHEN GREATEST(lv_ch, '阿') THEN lv_retstr || 'A'
                   ELSE lv_retstr || lv_ch
                   END;
    END IF;
  END LOOP;

  RETURN lv_retstr;

EXCEPTION WHEN OTHERS THEN
  RETURN '0';

END FNC_CWIT_GET_PYM;