前言:

最近处理一个特殊的问题,需要用到汉字自动转换拼音的功能。



解决:

在这里找了不少资料,都是有所缺陷,而且也好像很绕。其实是一个很简单的东东。后来还是自己写了一个函数获取。分享出来,给有需要的XD了。

-------------

这是一个比较简单的汉字转拼音的Oracle函数写法。

原理是,先将汉字对应的拼音存入一个表格。

然后对这个表格对应的存在的汉字找出其拼音,然后输出。

这样子做,容易维护,而且也容易扩展。如果万一发现哪个字少了,直接增加表格记录即可。

步骤如下:

----建立汉字拼音对照表_表格。

CREATE TABLE XYG.XYG_chinese_Spell(
chinese_Spell_ID NUMBER NOT NULL,--表格ID
chinese_Spell VARCHAR2(50) NOT NULL,    -- 汉语拼音
chinese_Word VARCHAR2(4000) NOT NULL    -- 汉字堆
---5 who
,CREATED_BY NUMBER DEFAULT -1 NOT NULL --创建者
,CREATION_DATE DATE DEFAULT SYSDATE NOT NULL --创建日期
,LAST_UPDATED_BY NUMBER DEFAULT -1NOT NULL --最后更新人
,LAST_UPDATE_DATE DATE DEFAULT SYSDATE NOT NULL --最后更新日期
,LAST_UPDATE_LOGIN NUMBER DEFAULT -1NOT NULL --最后登陆人
,ATTRIBUTE_CATEGORY VARCHAR2(30)
,ATTRIBUTE1 VARCHAR2(240)
,ATTRIBUTE2 VARCHAR2(240)
,ATTRIBUTE3 VARCHAR2(240)
,ATTRIBUTE4 VARCHAR2(240)
,ATTRIBUTE5 VARCHAR2(240)
,ATTRIBUTE6 VARCHAR2(240)
,ATTRIBUTE7 VARCHAR2(240)
,ATTRIBUTE8 VARCHAR2(240)
,ATTRIBUTE9 VARCHAR2(240)
,ATTRIBUTE10 VARCHAR2(240)
,ATTRIBUTE11 VARCHAR2(240)
,ATTRIBUTE12 VARCHAR2(240)
,ATTRIBUTE13 VARCHAR2(240)
,ATTRIBUTE14 VARCHAR2(240)
,ATTRIBUTE15 VARCHAR2(240)
,CONSTRAINT PK_chinese_Spell PRIMARY KEY(chinese_Spell_ID)
)
TABLESPACE XYG_DATA ;
COMMENT ON TABLE XYG.XYG_chinese_Spell IS 'XYG_汉字对应拼音';
CREATE SYNONYM APPS.XYG_chinese_Spell FOR XYG.XYG_chinese_Spell;
CREATE SEQUENCE XYG.XYG_chinese_Spell_S
NOMAXVALUE
MINVALUE 1;
--DROP SYNONYM APPS.XYG_chinese_Spell_S;
CREATE SYNONYM APPS.XYG_chinese_Spell_S FOR XYG.XYG_chinese_Spell_S;
CREATE UNIQUE INDEX XYG.XYG_chinese_Spell_U1
ON XYG.XYG_chinese_Spell(chinese_Word)
TABLESPACE XYG_IDX;
--DROP TABLE XYG_chinese_Spell_TEMP;
---创建临时表,要将Excel的数据导入到这个表格。
CREATE TABLE XYG_chinese_Spell_TEMP(
chinese_Spell VARCHAR2(500),    -- 汉语拼音
chinese_Word VARCHAR2(4000) -- 汉字堆
);

---接着要用Toad工具导入对应的拼音汉字对照表(汉字拼音对照表_IMPORT.xls)。

---Excel文档以及相关资料下载:http://download.csdn.net/detail/samt007/5165175

---PS:用Pl/SQL Developer工具导入好像会报错:ora-01480 trailing null missing from str bind value

SELECT * FROM XYG_chinese_Spell_TEMP;
---去掉分号
UPDATE XYG_chinese_Spell_TEMP
SET CHINESE_WORD = REPLACE(CHINESE_WORD,'''',NULL);
---去掉逗号
UPDATE XYG_chinese_Spell_TEMP
SET CHINESE_WORD = REPLACE(CHINESE_WORD,',',NULL);
---去掉空格
UPDATE XYG_chinese_Spell_TEMP
SET CHINESE_WORD = LTRIM(TRIM(CHINESE_WORD));
UPDATE XYG_chinese_Spell_TEMP
SET CHINESE_SPELL = LTRIM(TRIM(CHINESE_SPELL));
COMMIT;
---向正式表格塞入:
INSERT INTO XYG_chinese_Spell(chinese_Spell_ID,CHINESE_SPELL,CHINESE_WORD)
SELECT XYG_chinese_Spell_S.NEXTVAL
,CHINESE_SPELL
,CHINESE_WORD
FROM XYG_chinese_Spell_TEMP;
COMMIT;
SELECT * FROM XYG_chinese_Spell
WHERE CHINESE_WORD LIKE '%你%'
---检查数据没问题,则可以dorp掉临时表
DROP TABLE XYG_chinese_Spell_TEMP;
----接着建立函数:
---get_chinese_Spell ;函数内容下面有。
---注意函数的输入参数。可以任意输出想要的格式~
SELECT XYG_PUB_COMMON_PKG.get_chinese_Spell('我的文档','_','FULL','INITCAP','#',0) FROM DUAL

---样例:



---后期数据的整理:

---因为存在一个字多个拼音,这个拼音如何抓取的问题。目前抓取的逻辑是抓最大ID的对应的拼音。

----汉字博大精深啊。

---将一些重复的字的拿掉。例如,信=xin。别的拿掉。如果你觉得有需要。

UPDATE XYG_chinese_Spell
SET CHINESE_WORD = REPLACE(CHINESE_WORD,'信',NULL)
WHERE chinese_Spell_ID = 450;
UPDATE XYG_chinese_Spell
SET CHINESE_WORD = REPLACE(CHINESE_WORD,'查',NULL)
WHERE chinese_Spell_ID IN (69,133);
UPDATE XYG_chinese_Spell
SET CHINESE_WORD = REPLACE(CHINESE_WORD,'掉',NULL)
WHERE chinese_Spell_ID IN (367);
UPDATE XYG_chinese_Spell
SET CHINESE_WORD = REPLACE(CHINESE_WORD,'数',NULL)
WHERE chinese_Spell_ID IN (461);
UPDATE XYG_chinese_Spell
SET CHINESE_WORD = REPLACE(CHINESE_WORD,'题',NULL)
WHERE chinese_Spell_ID IN (170);
UPDATE XYG_chinese_Spell
SET CHINESE_WORD = REPLACE(CHINESE_WORD,'精',NULL)
WHERE CHINESE_CODE_ID IN (407);
UPDATE XYG_chinese_Spell
SET CHINESE_WORD = REPLACE(CHINESE_WORD,'以',NULL)
WHERE chinese_Spell_ID IN (463);

---------------------我是美丽的分隔符-------------------------

函数部分:

    --SELECT XYG_PUB_COMMON_PKG.get_chinese_Spell('我的文档(东镀囧)001','_','FULL','INITCAP','#',0) FROM DUAL
function get_chinese_Spell(p_cnStr In varchar2
,P_SEPARATOR In varchar2 Default Null--输出汉字的分隔符
,p_output_type In varchar2 Default Null--输出格式,是首字大写FIRST还是全部FULL
,P_CASE_TYPE IN VARCHAR2 DEFAULT 'LOWER'---输出汉字的拼音的格式,小写,大写还是首字母大写INITCAP。
,P_UNKNOW_SPELL VARCHAR2 DEFAULT '#'---识别不了的用哪个字符显示
,P_RAISE IN NUMBER DEFAULT XYG_PUB_CONST_PKG.C_TRUE) return varchar2
as
lv_spell varchar2(3000);
lv_temp Varchar2(100);
lv_char varchar2(100);
---
lv_exists_cn boolean;--是否存在汉字的 ---获取单个的拼音
Function get_signle_spell(P_SIGNLE_CHINESE IN VARCHAR2) return VARCHAR2
is
l_return XYG_chinese_Spell.CHINESE_SPELL%TYPE;
begin
SELECT XCS1.CHINESE_SPELL
INTO l_return
FROM XYG_chinese_Spell XCS1
WHERE XCS1.CHINESE_Spell_ID =
(SELECT MAX(XCS2.CHINESE_Spell_ID)
FROM XYG_chinese_Spell XCS2
WHERE XCS2.CHINESE_WORD LIKE '%'||P_SIGNLE_CHINESE||'%');
RETURN l_return;
EXCEPTION
WHEN OTHERS THEN
RETURN P_UNKNOW_SPELL;
end;
begin
if p_cnStr is null then
return '';
end if;
lv_exists_cn := false;
for i In 1..length(p_cnStr) loop
lv_char:=substr(p_cnStr,i,1);
if lengthb(lv_char) = 1 then
if lv_exists_cn then
lv_spell:=lv_spell||P_SEPARATOR||lv_char;
lv_exists_cn := false;
else
lv_spell:=lv_spell||lv_char;
end if;
else--汉字:
----如果是常用的符号,也要转换。只是单对单的转换。
if lv_char = ',' then--逗号
lv_temp := ',';
elsif lv_char = '。' then--句号
lv_temp := '.';
elsif lv_char = '?' then--问号
lv_temp := '?';
elsif lv_char = '!' then--感叹号
lv_temp := '!';
elsif lv_char = '‘' then--单引号
lv_temp := '''';
elsif lv_char = '“' then--双引号
lv_temp := '"';
elsif lv_char = ';' then--分号
lv_temp := ';';
elsif lv_char = ':' then--冒号
lv_temp := ':';
else
lv_exists_cn := true;
lv_temp := get_signle_spell(lv_char);
IF P_CASE_TYPE = 'LOWER' THEN
lv_temp := LOWER(lv_temp);
ELSIF P_CASE_TYPE = 'UPPER' THEN
lv_temp := UPPER(lv_temp);
ELSIF P_CASE_TYPE = 'INITCAP' THEN
lv_temp := INITCAP(lv_temp);
ELSE
NULL;
END IF;
end if; if p_output_type = 'FIRST' then
lv_spell:=lv_spell||P_SEPARATOR||substr(lv_temp,1,1);
else
lv_spell:=lv_spell||P_SEPARATOR||lv_temp;
end if;
end if;
end loop; ---将左边的分隔符去掉
IF P_SEPARATOR IS NOT NULL THEN
lv_spell := LTRIM(lv_spell,P_SEPARATOR);
END IF;
return lv_spell; end;

来自:http://www.itpub.net/thread-1774405-1-8.html

汉字转拼音的Oracle函数的更多相关文章

  1. SqlServer 汉字转换拼音首字母函数

    CREATE function [dbo].[Func_GetPY](@str nvarchar(4000))returns nvarchar(4000)asbegin set @str=RTRIM( ...

  2. oracle 根据汉字返回拼音函数

    参见戴明明的博客,oracle 根据汉字返回拼音函数,由于他的博客里没有提供完整的代码,研究了一个多小时,才弄出来: 上来贴代码吧.. --------------Type Definition CR ...

  3. Oracle提取中文字符串拼音首字母函数

    通过oracle的NLSSORT函数对汉字按照拼音排序,然后根据汉字的区间返回对应的首字母. 效果1,获取拼音简码: 效果2,获取姓名首字母: 创建函数: /* 获取拼音简码函数 */ CREATE ...

  4. SQL汉字转拼音函数-支持首字母、全拼

    SQL汉字转拼音函数-支持首字母.全拼 FROM :http://my.oschina.net/ind/blog/191659 作者不详 --方法一sqlserver汉字转拼音首字母 --调用方法 s ...

  5. sql函数:汉字转换为拼音

    sql数据库自定义一个函数把下面代码写进去 功能是得到汉字拼音首字母create function fun_getPY(@str nvarchar(4000)) returns nvarchar(40 ...

  6. 汉字转拼音 oracle方式 [转]

    oracle汉字转拼音(获得全拼/拼音首字母/拼音截取等)   效果如下: Oracle 字符集 GBK 没有问题 , UTF -8 需要修改一下   Sql代码   --oracle汉字转拼音 PA ...

  7. oracle汉字转拼音(获得全拼/拼音首字母/拼音截取等)

        oracle汉字转拼音(获得全拼/拼音首字母/拼音截取等)   效果如下: Oracle 字符集 GBK 没有问题 , UTF -8 需要修改一下   Sql代码   --oracle汉字转拼 ...

  8. oracle 汉字转拼音

    oracle汉字转拼音(获得全拼/拼音首字母/拼音截取等) 效果如下: Oracle 字符集 GBK 没有问题 , UTF -8 需要修改一下 Sql代码 --oracle汉字转拼音 PACKAGE ...

  9. sql获取汉字的拼音首字母的函数

    ql获取汉字的拼音首字母   if exists (select * from sysobjects where id = object_id(N'[fn_ChineseToSpell]') and ...

随机推荐

  1. JavaBean toString方式

    package object; import java.util.Date; public class ReportDataQo implements java.io.Serializable { p ...

  2. 开发网页时,127.0.0.1或者localhost能访问,而本机地址不能访问的解决

    第一 ping试试 127.0.0.1 和 本机地址 若127.0.0.1可以 说明可以自己ping自己 若本机地址可以 说明host正常 第二 检查服务器部署 再部署一个新的 若新的正常 说明你项目 ...

  3. linux route 路由设置小记

    情景一: 有一台ip为172.16.160.53服务器,此服务器为固定ip,由于某些特殊情况,此服务器的ip不能修改. 现在这台服务器需要与另外一个网段ip为172.16.176.150服务器进行局域 ...

  4. ACM Smallest Difference

    给定一些不同的十进制数字(distinct decimal digits),您可以通过选择这些数字的非空子集(non-empty subset)并以某种顺序编写它们,从而形成一个整数. 剩下的数字可以 ...

  5. PHP MySQL 创建数据表

    PHP 创建 MySQL 表 一个数据表有一个唯一名称,并有行和列组成. 使用 MySQLi 和 PDO 创建 MySQL 表 CREATE TABLE 语句用于创建 MySQL 表. 我们将创建一个 ...

  6. JavaScript 函数定义

    JavaScript 使用关键字 function 定义函数. 函数可以通过声明定义,也可以是一个表达式. 函数声明 在之前的教程中,你已经了解了函数声明的语法 : function function ...

  7. Window下通过CuteFTP与Linux虚拟机连接失败的原因总结及解决方法

    环境:虚拟机类型Redhat Enterprise 6 (1) 虚拟机是否安装了ftp服务器? 若未安装,则yum install vsftpd,并启动ftp服务 (2) 虚拟机防火墙是否已关闭? 若 ...

  8. Dapper连接与事务的简单封装

    增删改查方面,已经有Dapper.Extension这么强大的工具了,我也实在没啥好写的,就随手写了个看起来比较优雅的连接与事务的封装.在之后使用Dapper.Extension类库时,完全可以照搬进 ...

  9. 推荐算法之用户推荐(UserCF)和物品推荐(ItemCF)对比

    一.定义 UserCF:推荐那些和他有共同兴趣爱好的用户喜欢的物品 ItemCF:推荐那些和他之前喜欢的物品类似的物品 根据用户推荐重点是反应和用户兴趣相似的小群体的热点,根据物品推荐着重与用户过去的 ...

  10. MySQL之sql文件的导入导出

    window下 1.导出整个数据库(无需登录mysql)mysqldump -u 用户名 -p 数据库名 > 导出的文件名mysqldump -u dbuser -p dbname > d ...