博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

获得一个字符串的拼音码

Posted on 2007-05-24 11:58  liufu627  阅读(275)  评论(0)    收藏  举报
create or replace function PY(P1 varchar2, P2 INT default 0 ) return varchar2 is
  Result varchar2(32767);
  /*
  获得汉字拼音字母
  入口参数,汉字字符串,是否只取第一个汉字的拼音首字母
  */
  CHAR1 varchar2(2);
  CHAR2 varchar2(2);
  LEN integer;
  N1  integer;
  N2 integer;
  CSOUND varchar2(32767);
begin
            IF P2 = 1 THEN
           LEN := 1;
       ELSE
           LEN := LENGTH(P1);
       END IF;
      
       FOR I IN 1..LEN LOOP
           CHAR2 := SUBSTR(P1, i, 1);
           N1 := FLOOR(ASCII(CHAR2) / 256);
           N2 := MOD(ASCII(CHAR2), 256);
          
           IF N1 = 0 AND N2 <= 129 THEN
               CHAR1 := CHAR2;
           ELSIF N2 <> 127 AND N2 <> 255 AND NOT (N2 >= 0 AND N2 <= 63)
           THEN
              --实现部分
                IF CHAR2 >= '丂' AND CHAR2 < '芭'    THEN CHAR1:= 'A';
                ELSIF CHAR2 >= '芭' AND CHAR2 < '擦' THEN CHAR1 := 'B';
                ELSIF  CHAR2 >= '擦' AND CHAR2 < '搭'THEN CHAR1 :='C';
                ELSIF CHAR2 >= '搭' AND CHAR2 < '蛾' THEN CHAR1 :='D';
                ELSIF CHAR2 >= '蛾' AND CHAR2 < '发' THEN CHAR1 :='E';
                ELSIF CHAR2 >= '发' AND CHAR2 < '噶' THEN CHAR1 :='F';
                ELSIF CHAR2 >= '噶' AND CHAR2 < '哈' THEN CHAR1 :='G';
                ELSIF CHAR2 >= '哈' AND CHAR2 < '击' THEN CHAR1 :='H';
                ELSIF CHAR2 >= '击' AND CHAR2 < '喀' THEN CHAR1 :='J';
                ELSIF CHAR2 >= '喀' AND CHAR2 < '垃' THEN CHAR1 :='K';
                ELSIF CHAR2 >= '垃' AND CHAR2 < '妈' THEN CHAR1 :='L';
                ELSIF CHAR2 >= '妈' AND CHAR2 < '拿' THEN CHAR1 :='M';
                ELSIF CHAR2 >= '拿' AND CHAR2 < '哦' THEN CHAR1 :='N';
                ELSIF CHAR2 >= '哦' AND CHAR2 < '啪' THEN CHAR1 :='O';
                ELSIF CHAR2 >= '啪' AND CHAR2 < '期' THEN CHAR1 :='P';
                ELSIF CHAR2 >= '期' AND CHAR2 < '然' THEN CHAR1 :='Q';
                ELSIF CHAR2 >= '然' AND CHAR2 < '撒' THEN CHAR1 :='R';
                ELSIF CHAR2 >= '撒' AND CHAR2 < '塌' THEN CHAR1 :='S';
                ELSIF CHAR2 >= '塌' AND CHAR2 < '挖' THEN CHAR1 :='T';
                ELSIF CHAR2 >= '挖' AND CHAR2 < '稀' THEN CHAR1 :='W';
                ELSIF CHAR2 >= '稀' AND CHAR2 < '压' THEN CHAR1 :='X';
                ELSIF CHAR2 >= '压' AND CHAR2 < '匝' THEN CHAR1 :='Y';
                ELSIF CHAR2 >= '匝' AND CHAR2 <= '鼱' THEN CHAR1 := 'Z';
                ELSE  CHAR1:='';
                END  IF;                    
          
           ELSE          
               CHAR1 := 'ER';          
           END IF;
          
           CSOUND := CSOUND || CHAR1;
       END LOOP;
      
       RETURN CSOUND;
 
  return Result;
end PY;

--测试用例,在Oracle8i下测试通过。
SELECT PY('中国人民是伟大的') FROM DUAL;
--将会输出 'ZGRMSWDD'
此上代码从网上抄录,实现部分原来是CASE部分,我有修改。