Oracle存储过程汉字转拼音简码支持两种字符集[精][转载]

根据姓名获得该姓名的拼音简码,如姓名为刘红,根据该函数获得的拼音为lh,该函数主要用户在查询时,可根据姓名的拼写简码进行查询 

数据库字符集为GBK: 

Java代码  收藏代码
  1. create or replace  
  2. function PY (P1 VARCHAR2,P2 INT default 0return VARCHAR2 as  
  3.        CHAR1 VARCHAR2(2);  
  4.        CHAR2 VARCHAR2(2);  
  5.        LEN INTEGER;  
  6.        N1 INTEGER;  
  7.        N2 INTEGER;  
  8.        CSOUND VARCHAR2(32767);  
  9.   
  10.    BEGIN  
  11.        IF P2 = 1 THEN  
  12.            LEN := 1;  
  13.        ELSE  
  14.            LEN := LENGTH(P1);  
  15.        END IF;  
  16.   
  17.   
  18.        FOR I IN 1..LEN LOOP  
  19.            CHAR2 := SUBSTR(P1, i, 1);  
  20.            N1 := FLOOR(ASCII(CHAR2) / 256);  
  21.            N2 := MOD(ASCII(CHAR2), 256);  
  22.   
  23.   
  24.            IF N1 = 0 AND N2 <= 129 THEN  
  25.                CHAR1 := CHAR2;  
  26.            ELSIF N2 <> 127 AND N2 <> 255 AND NOT (N2 >= 0 AND N2 <= 63) THEN  
  27.                SELECT  
  28.                    CASE  
  29.                       WHEN CHAR2 >= '丂' AND CHAR2 < '芭' THEN 'A'  
  30.                     WHEN CHAR2 >= '芭' AND CHAR2 < '擦' THEN 'B'  
  31.                       WHEN CHAR2 >= '擦' AND CHAR2 < '搭' THEN 'C'  
  32.                       WHEN CHAR2 >= '搭' AND CHAR2 < '蛾' THEN 'D'  
  33.                       WHEN CHAR2 >= '蛾' AND CHAR2 < '发' THEN 'E'  
  34.                       WHEN CHAR2 >= '发' AND CHAR2 < '噶' THEN 'F'  
  35.                       WHEN CHAR2 >= '噶' AND CHAR2 < '哈' THEN 'G'  
  36.                       WHEN CHAR2 >= '哈' AND CHAR2 < '击' THEN 'H'  
  37.                       WHEN CHAR2 >= '击' AND CHAR2 < '喀' THEN 'J'  
  38.                       WHEN CHAR2 >= '喀' AND CHAR2 < '垃' THEN 'K'  
  39.                       WHEN CHAR2 >= '垃' AND CHAR2 < '妈' THEN 'L'  
  40.                       WHEN CHAR2 >= '妈' AND CHAR2 < '拿' THEN 'M'  
  41.                       WHEN CHAR2 >= '拿' AND CHAR2 < '哦' THEN 'N'  
  42.                       WHEN CHAR2 >= '哦' AND CHAR2 < '啪' THEN 'O'  
  43.                       WHEN CHAR2 >= '啪' AND CHAR2 < '期' THEN 'P'  
  44.                       WHEN CHAR2 >= '期' AND CHAR2 < '然' THEN 'Q'  
  45.                       WHEN CHAR2 >= '然' AND CHAR2 < '撒' THEN 'R'  
  46.                       WHEN CHAR2 >= '撒' AND CHAR2 < '塌' THEN 'S'  
  47.                       WHEN CHAR2 >= '塌' AND CHAR2 < '挖' THEN 'T'  
  48.                       WHEN CHAR2 >= '挖' AND CHAR2 < '稀' THEN 'W'  
  49.                       WHEN CHAR2 >= '稀' AND CHAR2 < '压' THEN 'X'  
  50.                       WHEN CHAR2 >= '压' AND CHAR2 < '匝' THEN 'Y'  
  51.                       WHEN CHAR2 >= '匝' AND CHAR2 <= '鼱' THEN 'Z'  
  52.                    END  
  53.                    INTO CHAR1  
  54.                FROM DUAL;  
  55.            ELSE  
  56.                CHAR1 := 'ER';  
  57.            END IF;  
  58.   
  59.   
  60.            CSOUND := CSOUND || CHAR1;  
  61.        END LOOP;  
  62.   
  63.   
  64.        RETURN CSOUND;  
  65.    END;  

如果数据库字符集为UTF-8,则函数如下: 
Java代码  收藏代码
  1. create or replace  
  2. FUNCTION GETCH2SPELL(P_NAME IN VARCHAR2) RETURN VARCHAR2 AS  
  3.        V_COMPARE VARCHAR2(100);  
  4.        V_RETURN VARCHAR2(4000);  
  5.        CHAR1 VARCHAR2(3);  
  6.        CHAR2 VARCHAR2(3);  
  7.        LEN INTEGER;  
  8.        N1 INTEGER;  
  9.        N2 INTEGER;  
  10.   
  11.  FUNCTION F_NLSSORT(P_WORD IN VARCHAR2) RETURN VARCHAR2 AS  
  12.  BEGIN  
  13.  RETURN NLSSORT(P_WORD, 'NLS_SORT=SCHINESE_PINYIN_M');  
  14.  END;  
  15.  BEGIN  
  16.         LEN := LENGTH(P_NAME);   
  17.         FOR I IN 1..LEN LOOP  
  18.             CHAR2 := SUBSTR(P_NAME, i, 1);  
  19.             N1 := FLOOR(ASCII(CHAR2) / 256);  
  20.             N2 := MOD(ASCII(CHAR2), 256);  
  21.   
  22.             IF N1 = 0 AND N2 <= 129 THEN  
  23.                V_RETURN := V_RETURN || CHAR2;  
  24.             ELSIF N2 <> 127 AND N2 <> 255 AND NOT (N2 >= 0 AND N2 <= 63) THEN   
  25.                 V_COMPARE := F_NLSSORT(SUBSTR(P_NAME, I, 1));  
  26.                 IF V_COMPARE >= F_NLSSORT(' 吖 ') AND V_COMPARE <= F_NLSSORT('驁 ') THEN  
  27.                    V_RETURN := V_RETURN || 'A';  
  28.                 ELSIF V_COMPARE >= F_NLSSORT('八 ') AND V_COMPARE <= F_NLSSORT('簿 ') THEN  
  29.                    V_RETURN := V_RETURN || 'B';  
  30.                 ELSIF V_COMPARE >= F_NLSSORT('嚓 ') AND V_COMPARE <= F_NLSSORT('錯 ') THEN  
  31.                    V_RETURN := V_RETURN || 'C';  
  32.                 ELSIF V_COMPARE >= F_NLSSORT('咑 ') AND V_COMPARE <= F_NLSSORT('鵽 ') THEN  
  33.                    V_RETURN := V_RETURN || 'D';  
  34.                 ELSIF V_COMPARE >= F_NLSSORT('妸 ') AND V_COMPARE <= F_NLSSORT('樲 ') THEN  
  35.                    V_RETURN := V_RETURN || 'E';  
  36.                 ELSIF V_COMPARE >= F_NLSSORT('发 ') AND V_COMPARE <= F_NLSSORT('猤 ') THEN  
  37.                    V_RETURN := V_RETURN || 'F';  
  38.                 ELSIF V_COMPARE >= F_NLSSORT('旮 ') AND V_COMPARE <= F_NLSSORT('腂 ') THEN  
  39.                    V_RETURN := V_RETURN || 'G';  
  40.                 ELSIF V_COMPARE >= F_NLSSORT('妎 ') AND V_COMPARE <= F_NLSSORT('夻 ') THEN  
  41.                    V_RETURN := V_RETURN || 'H';  
  42.                 ELSIF V_COMPARE >= F_NLSSORT('丌 ') AND V_COMPARE <= F_NLSSORT('攈 ') THEN  
  43.                    V_RETURN := V_RETURN || 'J';  
  44.                 ELSIF V_COMPARE >= F_NLSSORT('咔 ') AND V_COMPARE <= F_NLSSORT('穒 ') THEN  
  45.                    V_RETURN := V_RETURN || 'K';  
  46.                 ELSIF V_COMPARE >= F_NLSSORT('垃 ') AND V_COMPARE <= F_NLSSORT('擽 ') THEN  
  47.                    V_RETURN := V_RETURN || 'L';  
  48.                 ELSIF V_COMPARE >= F_NLSSORT('嘸 ') AND V_COMPARE <= F_NLSSORT('椧 ') THEN  
  49.                    V_RETURN := V_RETURN || 'M';  
  50.                 ELSIF V_COMPARE >= F_NLSSORT('拏 ') AND V_COMPARE <= F_NLSSORT('瘧 ') THEN  
  51.                    V_RETURN := V_RETURN || 'N';  
  52.                 ELSIF V_COMPARE >= F_NLSSORT('筽 ') AND V_COMPARE <= F_NLSSORT('漚 ') THEN  
  53.                    V_RETURN := V_RETURN || 'O';  
  54.                 ELSIF V_COMPARE >= F_NLSSORT('妑 ') AND V_COMPARE <= F_NLSSORT('曝 ') THEN  
  55.                    V_RETURN := V_RETURN || 'P';  
  56.                 ELSIF V_COMPARE >= F_NLSSORT('七 ') AND V_COMPARE <= F_NLSSORT('裠 ') THEN  
  57.                    V_RETURN := V_RETURN || 'Q';  
  58.                 ELSIF V_COMPARE >= F_NLSSORT('亽 ') AND V_COMPARE <= F_NLSSORT('鶸 ') THEN  
  59.                    V_RETURN := V_RETURN || 'R';  
  60.                 ELSIF V_COMPARE >= F_NLSSORT('仨 ') AND V_COMPARE <= F_NLSSORT('蜶 ') THEN  
  61.                    V_RETURN := V_RETURN || 'S';  
  62.                 ELSIF V_COMPARE >= F_NLSSORT('侤 ') AND V_COMPARE <= F_NLSSORT('籜 ') THEN  
  63.                    V_RETURN := V_RETURN || 'T';  
  64.                 ELSIF V_COMPARE >= F_NLSSORT('屲 ') AND V_COMPARE <= F_NLSSORT('鶩 ') THEN  
  65.                    V_RETURN := V_RETURN || 'W';  
  66.                 ELSIF V_COMPARE >= F_NLSSORT('夕 ') AND V_COMPARE <= F_NLSSORT('鑂 ') THEN  
  67.                    V_RETURN := V_RETURN || 'X';  
  68.                 ELSIF V_COMPARE >= F_NLSSORT('丫 ') AND V_COMPARE <= F_NLSSORT('韻 ') THEN  
  69.                    V_RETURN := V_RETURN || 'Y';  
  70.                 ELSIF V_COMPARE >= F_NLSSORT('帀 ') AND V_COMPARE <= F_NLSSORT('咗 ') THEN  
  71.                    V_RETURN := V_RETURN || 'Z';  
  72.                 END IF;  
  73.             END IF;  
  74.         END LOOP;  
  75.     RETURN V_RETURN;  
  76.  END;  
posted @ 2012-04-16 22:03  水之原  阅读(3273)  评论(0编辑  收藏  举报