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

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

数据库字符集为GBK:

create or replace
function PY (P1 VARCHAR2,P2 INT default 0) return VARCHAR2 as
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
SELECT
CASE
WHEN CHAR2 >= '丂' AND CHAR2 < '芭' THEN 'A'
  WHEN CHAR2 >= '芭' AND CHAR2 < '擦' THEN 'B'
WHEN CHAR2 >= '擦' AND CHAR2 < '搭' THEN 'C'
WHEN CHAR2 >= '搭' AND CHAR2 < '蛾' THEN 'D'
WHEN CHAR2 >= '蛾' AND CHAR2 < '发' THEN 'E'
WHEN CHAR2 >= '发' AND CHAR2 < '噶' THEN 'F'
WHEN CHAR2 >= '噶' AND CHAR2 < '哈' THEN 'G'
WHEN CHAR2 >= '哈' AND CHAR2 < '击' THEN 'H'
WHEN CHAR2 >= '击' AND CHAR2 < '喀' THEN 'J'
WHEN CHAR2 >= '喀' AND CHAR2 < '垃' THEN 'K'
WHEN CHAR2 >= '垃' AND CHAR2 < '妈' THEN 'L'
WHEN CHAR2 >= '妈' AND CHAR2 < '拿' THEN 'M'
WHEN CHAR2 >= '拿' AND CHAR2 < '哦' THEN 'N'
WHEN CHAR2 >= '哦' AND CHAR2 < '啪' THEN 'O'
WHEN CHAR2 >= '啪' AND CHAR2 < '期' THEN 'P'
WHEN CHAR2 >= '期' AND CHAR2 < '然' THEN 'Q'
WHEN CHAR2 >= '然' AND CHAR2 < '撒' THEN 'R'
WHEN CHAR2 >= '撒' AND CHAR2 < '塌' THEN 'S'
WHEN CHAR2 >= '塌' AND CHAR2 < '挖' THEN 'T'
WHEN CHAR2 >= '挖' AND CHAR2 < '稀' THEN 'W'
WHEN CHAR2 >= '稀' AND CHAR2 < '压' THEN 'X'
WHEN CHAR2 >= '压' AND CHAR2 < '匝' THEN 'Y'
WHEN CHAR2 >= '匝' AND CHAR2 <= '鼱' THEN 'Z'
END
INTO CHAR1
FROM DUAL;
ELSE
CHAR1 := 'ER';
END IF;


CSOUND := CSOUND || CHAR1;
END LOOP;


RETURN CSOUND;
END;

如果数据库字符集为UTF-8,则函数如下:
create or replace
FUNCTION GETCH2SPELL(P_NAME IN VARCHAR2) RETURN VARCHAR2 AS
V_COMPARE VARCHAR2(100);
V_RETURN VARCHAR2(4000);
CHAR1 VARCHAR2(3);
CHAR2 VARCHAR2(3);
LEN INTEGER;
N1 INTEGER;
N2 INTEGER;

FUNCTION F_NLSSORT(P_WORD IN VARCHAR2) RETURN VARCHAR2 AS
BEGIN
RETURN NLSSORT(P_WORD, 'NLS_SORT=SCHINESE_PINYIN_M');
END;
BEGIN
LEN := LENGTH(P_NAME);
FOR I IN 1..LEN LOOP
CHAR2 := SUBSTR(P_NAME, i, 1);
N1 := FLOOR(ASCII(CHAR2) / 256);
N2 := MOD(ASCII(CHAR2), 256);

IF N1 = 0 AND N2 <= 129 THEN
V_RETURN := V_RETURN || CHAR2;
ELSIF N2 <> 127 AND N2 <> 255 AND NOT (N2 >= 0 AND N2 <= 63) THEN
V_COMPARE := F_NLSSORT(SUBSTR(P_NAME, I, 1));
IF V_COMPARE >= F_NLSSORT(' 吖 ') AND V_COMPARE <= F_NLSSORT('驁 ') THEN
V_RETURN := V_RETURN || 'A';
ELSIF V_COMPARE >= F_NLSSORT('八 ') AND V_COMPARE <= F_NLSSORT('簿 ') THEN
V_RETURN := V_RETURN || 'B';
ELSIF V_COMPARE >= F_NLSSORT('嚓 ') AND V_COMPARE <= F_NLSSORT('錯 ') THEN
V_RETURN := V_RETURN || 'C';
ELSIF V_COMPARE >= F_NLSSORT('咑 ') AND V_COMPARE <= F_NLSSORT('鵽 ') THEN
V_RETURN := V_RETURN || 'D';
ELSIF V_COMPARE >= F_NLSSORT('妸 ') AND V_COMPARE <= F_NLSSORT('樲 ') THEN
V_RETURN := V_RETURN || 'E';
ELSIF V_COMPARE >= F_NLSSORT('发 ') AND V_COMPARE <= F_NLSSORT('猤 ') THEN
V_RETURN := V_RETURN || 'F';
ELSIF V_COMPARE >= F_NLSSORT('旮 ') AND V_COMPARE <= F_NLSSORT('腂 ') THEN
V_RETURN := V_RETURN || 'G';
ELSIF V_COMPARE >= F_NLSSORT('妎 ') AND V_COMPARE <= F_NLSSORT('夻 ') THEN
V_RETURN := V_RETURN || 'H';
ELSIF V_COMPARE >= F_NLSSORT('丌 ') AND V_COMPARE <= F_NLSSORT('攈 ') THEN
V_RETURN := V_RETURN || 'J';
ELSIF V_COMPARE >= F_NLSSORT('咔 ') AND V_COMPARE <= F_NLSSORT('穒 ') THEN
V_RETURN := V_RETURN || 'K';
ELSIF V_COMPARE >= F_NLSSORT('垃 ') AND V_COMPARE <= F_NLSSORT('擽 ') THEN
V_RETURN := V_RETURN || 'L';
ELSIF V_COMPARE >= F_NLSSORT('嘸 ') AND V_COMPARE <= F_NLSSORT('椧 ') THEN
V_RETURN := V_RETURN || 'M';
ELSIF V_COMPARE >= F_NLSSORT('拏 ') AND V_COMPARE <= F_NLSSORT('瘧 ') THEN
V_RETURN := V_RETURN || 'N';
ELSIF V_COMPARE >= F_NLSSORT('筽 ') AND V_COMPARE <= F_NLSSORT('漚 ') THEN
V_RETURN := V_RETURN || 'O';
ELSIF V_COMPARE >= F_NLSSORT('妑 ') AND V_COMPARE <= F_NLSSORT('曝 ') THEN
V_RETURN := V_RETURN || 'P';
ELSIF V_COMPARE >= F_NLSSORT('七 ') AND V_COMPARE <= F_NLSSORT('裠 ') THEN
V_RETURN := V_RETURN || 'Q';
ELSIF V_COMPARE >= F_NLSSORT('亽 ') AND V_COMPARE <= F_NLSSORT('鶸 ') THEN
V_RETURN := V_RETURN || 'R';
ELSIF V_COMPARE >= F_NLSSORT('仨 ') AND V_COMPARE <= F_NLSSORT('蜶 ') THEN
V_RETURN := V_RETURN || 'S';
ELSIF V_COMPARE >= F_NLSSORT('侤 ') AND V_COMPARE <= F_NLSSORT('籜 ') THEN
V_RETURN := V_RETURN || 'T';
ELSIF V_COMPARE >= F_NLSSORT('屲 ') AND V_COMPARE <= F_NLSSORT('鶩 ') THEN
V_RETURN := V_RETURN || 'W';
ELSIF V_COMPARE >= F_NLSSORT('夕 ') AND V_COMPARE <= F_NLSSORT('鑂 ') THEN
V_RETURN := V_RETURN || 'X';
ELSIF V_COMPARE >= F_NLSSORT('丫 ') AND V_COMPARE <= F_NLSSORT('韻 ') THEN
V_RETURN := V_RETURN || 'Y';
ELSIF V_COMPARE >= F_NLSSORT('帀 ') AND V_COMPARE <= F_NLSSORT('咗 ') THEN
V_RETURN := V_RETURN || 'Z';
END IF;
END IF;
END LOOP;
RETURN V_RETURN;
END;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值