`
csyqbtlsz
  • 浏览: 24632 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle拼音检索

阅读更多

       最近客户提出新需求说希望可以对数据的某一字段进行拼音检索,因此对这个东西找了点资料研究了一下,一般这种作为查询条件的拼音检索,都通过数据库实现,而非程序实现,因为程序实现无法将条件嵌入到SQL语句中进行匹配。保存汉字可以用ZHS16GBK需要两个字节,而使用UTF8字符集需要三个字节,目前拼音只跟ZHS16GBK有对应关系,对应关系为(第一个字节)*256+((第二个字节)-256*256)。因此如果使用的是UTF8字符集,那么必须先转换成ZHS16GBK字符集。具体实现如下:

1. 创建一个Oracle对象,用于保存拼音和编码的对应关系:

 

 

CREATE OR REPLACE TYPE spcode
AS OBJECT
(
   "name" VARCHAR2(10),
   "code" NUMBER
);

 

 

2.创建一个PL/SQL表,为下面实现管道表函数做准备,定义如下:

 

 

CREATE OR REPLACE TYPE tbl_spcode IS TABLE OF spcode;
 

 

3.创建一个管道表函数,用于返回拼音字母和编码对应关系的二维表,具体实现如下:

 

CREATE OR REPLACE FUNCTION getTblSpcode RETURN tbl_spcode PIPELINED
IS
BEGIN
  PIPE ROW(spcode('a', -20319)); 
  PIPE ROW(spcode('ai', -20317)); 
  PIPE ROW(spcode('an', -20304)); 
  PIPE ROW(spcode('ang', -20295)); 
  PIPE ROW(spcode('ao', -20292)); 
  PIPE ROW(spcode('ba', -20283)); 
  PIPE ROW(spcode('bai', -20265)); 
  PIPE ROW(spcode('ban', -20257)); 
  PIPE ROW(spcode('bang', -20242)); 
  PIPE ROW(spcode('bao', -20230)); 
  PIPE ROW(spcode('bei', -20051)); 
  PIPE ROW(spcode('ben', -20036)); 
  PIPE ROW(spcode('beng', -20032)); 
  PIPE ROW(spcode('bi', -20026)); 
  PIPE ROW(spcode('bian', -20002)); 
  PIPE ROW(spcode('biao', -19990)); 
  PIPE ROW(spcode('bie', -19986)); 
  PIPE ROW(spcode('bin', -19982)); 
  PIPE ROW(spcode('bing', -19976)); 
  PIPE ROW(spcode('bo', -19805)); 
  PIPE ROW(spcode('bu', -19784)); 
  PIPE ROW(spcode('ca', -19775)); 
  PIPE ROW(spcode('cai', -19774)); 
  PIPE ROW(spcode('can', -19763)); 
  PIPE ROW(spcode('cang', -19756)); 
  PIPE ROW(spcode('cao', -19751)); 
  PIPE ROW(spcode('ce', -19746)); 
  PIPE ROW(spcode('ceng', -19741)); 
  PIPE ROW(spcode('cha', -19739)); 
  PIPE ROW(spcode('chai', -19728)); 
  PIPE ROW(spcode('chan', -19725)); 
  PIPE ROW(spcode('chang', -19715)); 
  PIPE ROW(spcode('chao', -19540)); 
  PIPE ROW(spcode('che', -19531)); 
  PIPE ROW(spcode('chen', -19525)); 
  PIPE ROW(spcode('cheng', -19515)); 
  PIPE ROW(spcode('chi', -19500)); 
  PIPE ROW(spcode('chong', -19484)); 
  PIPE ROW(spcode('chou', -19479)); 
  PIPE ROW(spcode('chu', -19467)); 
  PIPE ROW(spcode('chuai', -19289)); 
  PIPE ROW(spcode('chuan', -19288)); 
  PIPE ROW(spcode('chuang', -19281)); 
  PIPE ROW(spcode('chui', -19275)); 
  PIPE ROW(spcode('chun', -19270)); 
  PIPE ROW(spcode('chuo', -19263)); 
  PIPE ROW(spcode('ci', -19261)); 
  PIPE ROW(spcode('cong', -19249)); 
  PIPE ROW(spcode('cou', -19243)); 
  PIPE ROW(spcode('cu', -19242)); 
  PIPE ROW(spcode('cuan', -19238)); 
  PIPE ROW(spcode('cui', -19235)); 
  PIPE ROW(spcode('cun', -19227)); 
  PIPE ROW(spcode('cuo', -19224)); 
  PIPE ROW(spcode('da', -19218)); 
  PIPE ROW(spcode('dai', -19212)); 
  PIPE ROW(spcode('dan', -19038)); 
  PIPE ROW(spcode('dang', -19023)); 
  PIPE ROW(spcode('dao', -19018)); 
  PIPE ROW(spcode('de', -19006)); 
  PIPE ROW(spcode('deng', -19003)); 
  PIPE ROW(spcode('di', -18996)); 
  PIPE ROW(spcode('dian', -18977)); 
  PIPE ROW(spcode('diao', -18961)); 
  PIPE ROW(spcode('die', -18952)); 
  PIPE ROW(spcode('ding', -18783)); 
  PIPE ROW(spcode('diu', -18774)); 
  PIPE ROW(spcode('dong', -18773)); 
  PIPE ROW(spcode('dou', -18763)); 
  PIPE ROW(spcode('du', -18756)); 
  PIPE ROW(spcode('duan', -18741)); 
  PIPE ROW(spcode('dui', -18735)); 
  PIPE ROW(spcode('dun', -18731)); 
  PIPE ROW(spcode('duo', -18722)); 
  PIPE ROW(spcode('e', -18710)); 
  PIPE ROW(spcode('en', -18697)); 
  PIPE ROW(spcode('er', -18696)); 
  PIPE ROW(spcode('fa', -18526)); 
  PIPE ROW(spcode('fan', -18518)); 
  PIPE ROW(spcode('fang', -18501)); 
  PIPE ROW(spcode('fei', -18490)); 
  PIPE ROW(spcode('fen', -18478)); 
  PIPE ROW(spcode('feng', -18463)); 
  PIPE ROW(spcode('fo', -18448)); 
  PIPE ROW(spcode('fou', -18447)); 
  PIPE ROW(spcode('fu', -18446)); 
  PIPE ROW(spcode('ga', -18239)); 
  PIPE ROW(spcode('gai', -18237)); 
  PIPE ROW(spcode('gan', -18231)); 
  PIPE ROW(spcode('gang', -18220)); 
  PIPE ROW(spcode('gao', -18211)); 
  PIPE ROW(spcode('ge', -18201)); 
  PIPE ROW(spcode('gei', -18184)); 
  PIPE ROW(spcode('gen', -18183)); 
  PIPE ROW(spcode('geng', -18181)); 
  PIPE ROW(spcode('gong', -18012)); 
  PIPE ROW(spcode('gou', -17997)); 
  PIPE ROW(spcode('gu', -17988)); 
  PIPE ROW(spcode('gua', -17970)); 
  PIPE ROW(spcode('guai', -17964)); 
  PIPE ROW(spcode('guan', -17961)); 
  PIPE ROW(spcode('guang', -17950)); 
  PIPE ROW(spcode('gui', -17947)); 
  PIPE ROW(spcode('gun', -17931)); 
  PIPE ROW(spcode('guo', -17928)); 
  PIPE ROW(spcode('ha', -17922)); 
  PIPE ROW(spcode('hai', -17759)); 
  PIPE ROW(spcode('han', -17752)); 
  PIPE ROW(spcode('hang', -17733)); 
  PIPE ROW(spcode('hao', -17730)); 
  PIPE ROW(spcode('he', -17721)); 
  PIPE ROW(spcode('hei', -17703)); 
  PIPE ROW(spcode('hen', -17701)); 
  PIPE ROW(spcode('heng', -17697)); 
  PIPE ROW(spcode('hong', -17692)); 
  PIPE ROW(spcode('hou', -17683)); 
  PIPE ROW(spcode('hu', -17676)); 
  PIPE ROW(spcode('hua', -17496)); 
  PIPE ROW(spcode('huai', -17487)); 
  PIPE ROW(spcode('huan', -17482)); 
  PIPE ROW(spcode('huang', -17468)); 
  PIPE ROW(spcode('hui', -17454)); 
  PIPE ROW(spcode('hun', -17433)); 
  PIPE ROW(spcode('huo', -17427)); 
  PIPE ROW(spcode('ji', -17417)); 
  PIPE ROW(spcode('jia', -17202)); 
  PIPE ROW(spcode('jian', -17185)); 
  PIPE ROW(spcode('jiang', -16983)); 
  PIPE ROW(spcode('jiao', -16970)); 
  PIPE ROW(spcode('jie', -16942)); 
  PIPE ROW(spcode('jin', -16915)); 
  PIPE ROW(spcode('jing', -16733)); 
  PIPE ROW(spcode('jiong', -16708)); 
  PIPE ROW(spcode('jiu', -16706)); 
  PIPE ROW(spcode('ju', -16689)); 
  PIPE ROW(spcode('juan', -16664)); 
  PIPE ROW(spcode('jue', -16657)); 
  PIPE ROW(spcode('jun', -16647)); 
  PIPE ROW(spcode('ka', -16474)); 
  PIPE ROW(spcode('kai', -16470)); 
  PIPE ROW(spcode('kan', -16465)); 
  PIPE ROW(spcode('kang', -16459)); 
  PIPE ROW(spcode('kao', -16452)); 
  PIPE ROW(spcode('ke', -16448)); 
  PIPE ROW(spcode('ken', -16433)); 
  PIPE ROW(spcode('keng', -16429)); 
  PIPE ROW(spcode('kong', -16427)); 
  PIPE ROW(spcode('kou', -16423)); 
  PIPE ROW(spcode('ku', -16419)); 
  PIPE ROW(spcode('kua', -16412)); 
  PIPE ROW(spcode('kuai', -16407)); 
  PIPE ROW(spcode('kuan', -16403)); 
  PIPE ROW(spcode('kuang', -16401)); 
  PIPE ROW(spcode('kui', -16393)); 
  PIPE ROW(spcode('kun', -16220)); 
  PIPE ROW(spcode('kuo', -16216)); 
  PIPE ROW(spcode('la', -16212)); 
  PIPE ROW(spcode('lai', -16205)); 
  PIPE ROW(spcode('lan', -16202)); 
  PIPE ROW(spcode('lang', -16187)); 
  PIPE ROW(spcode('lao', -16180)); 
  PIPE ROW(spcode('le', -16171)); 
  PIPE ROW(spcode('lei', -16169)); 
  PIPE ROW(spcode('leng', -16158)); 
  PIPE ROW(spcode('li', -16155)); 
  PIPE ROW(spcode('lia', -15959)); 
  PIPE ROW(spcode('lian', -15958)); 
  PIPE ROW(spcode('liang', -15944)); 
  PIPE ROW(spcode('liao', -15933)); 
  PIPE ROW(spcode('lie', -15920)); 
  PIPE ROW(spcode('lin', -15915)); 
  PIPE ROW(spcode('ling', -15903)); 
  PIPE ROW(spcode('liu', -15889)); 
  PIPE ROW(spcode('long', -15878)); 
  PIPE ROW(spcode('lou', -15707)); 
  PIPE ROW(spcode('lu', -15701)); 
  PIPE ROW(spcode('lv', -15681)); 
  PIPE ROW(spcode('luan', -15667)); 
  PIPE ROW(spcode('lue', -15661)); 
  PIPE ROW(spcode('lun', -15659)); 
  PIPE ROW(spcode('luo', -15652)); 
  PIPE ROW(spcode('ma', -15640)); 
  PIPE ROW(spcode('mai', -15631)); 
  PIPE ROW(spcode('man', -15625)); 
  PIPE ROW(spcode('mang', -15454)); 
  PIPE ROW(spcode('mao', -15448)); 
  PIPE ROW(spcode('me', -15436)); 
  PIPE ROW(spcode('mei', -15435)); 
  PIPE ROW(spcode('men', -15419)); 
  PIPE ROW(spcode('meng', -15416)); 
  PIPE ROW(spcode('mi', -15408)); 
  PIPE ROW(spcode('mian', -15394)); 
  PIPE ROW(spcode('miao', -15385)); 
  PIPE ROW(spcode('mie', -15377)); 
  PIPE ROW(spcode('min', -15375)); 
  PIPE ROW(spcode('ming', -15369)); 
  PIPE ROW(spcode('miu', -15363)); 
  PIPE ROW(spcode('mo', -15362)); 
  PIPE ROW(spcode('mou', -15183)); 
  PIPE ROW(spcode('mu', -15180)); 
  PIPE ROW(spcode('na', -15165)); 
  PIPE ROW(spcode('nai', -15158)); 
  PIPE ROW(spcode('nan', -15153)); 
  PIPE ROW(spcode('nang', -15150)); 
  PIPE ROW(spcode('nao', -15149)); 
  PIPE ROW(spcode('ne', -15144)); 
  PIPE ROW(spcode('nei', -15143)); 
  PIPE ROW(spcode('nen', -15141)); 
  PIPE ROW(spcode('neng', -15140)); 
  PIPE ROW(spcode('ni', -15139)); 
  PIPE ROW(spcode('nian', -15128)); 
  PIPE ROW(spcode('niang', -15121)); 
  PIPE ROW(spcode('niao', -15119)); 
  PIPE ROW(spcode('nie', -15117)); 
  PIPE ROW(spcode('nin', -15110)); 
  PIPE ROW(spcode('ning', -15109)); 
  PIPE ROW(spcode('niu', -14941)); 
  PIPE ROW(spcode('nong', -14937)); 
  PIPE ROW(spcode('nu', -14933)); 
  PIPE ROW(spcode('nv', -14930)); 
  PIPE ROW(spcode('nuan', -14929)); 
  PIPE ROW(spcode('nue', -14928)); 
  PIPE ROW(spcode('nuo', -14926)); 
  PIPE ROW(spcode('o', -14922)); 
  PIPE ROW(spcode('ou', -14921)); 
  PIPE ROW(spcode('pa', -14914)); 
  PIPE ROW(spcode('pai', -14908)); 
  PIPE ROW(spcode('pan', -14902)); 
  PIPE ROW(spcode('pang', -14894)); 
  PIPE ROW(spcode('pao', -14889)); 
  PIPE ROW(spcode('pei', -14882)); 
  PIPE ROW(spcode('pen', -14873)); 
  PIPE ROW(spcode('peng', -14871)); 
  PIPE ROW(spcode('pi', -14857)); 
  PIPE ROW(spcode('pian', -14678)); 
  PIPE ROW(spcode('piao', -14674)); 
  PIPE ROW(spcode('pie', -14670)); 
  PIPE ROW(spcode('pin', -14668)); 
  PIPE ROW(spcode('ping', -14663)); 
  PIPE ROW(spcode('po', -14654)); 
  PIPE ROW(spcode('pu', -14645)); 
  PIPE ROW(spcode('qi', -14630)); 
  PIPE ROW(spcode('qia', -14594)); 
  PIPE ROW(spcode('qian', -14429)); 
  PIPE ROW(spcode('qiang', -14407)); 
  PIPE ROW(spcode('qiao', -14399)); 
  PIPE ROW(spcode('qie', -14384)); 
  PIPE ROW(spcode('qin', -14379)); 
  PIPE ROW(spcode('qing', -14368)); 
  PIPE ROW(spcode('qiong', -14355)); 
  PIPE ROW(spcode('qiu', -14353)); 
  PIPE ROW(spcode('qu', -14345)); 
  PIPE ROW(spcode('quan', -14170)); 
  PIPE ROW(spcode('que', -14159)); 
  PIPE ROW(spcode('qun', -14151)); 
  PIPE ROW(spcode('ran', -14149)); 
  PIPE ROW(spcode('rang', -14145)); 
  PIPE ROW(spcode('rao', -14140)); 
  PIPE ROW(spcode('re', -14137)); 
  PIPE ROW(spcode('ren', -14135)); 
  PIPE ROW(spcode('reng', -14125)); 
  PIPE ROW(spcode('ri', -14123)); 
  PIPE ROW(spcode('rong', -14122)); 
  PIPE ROW(spcode('rou', -14112)); 
  PIPE ROW(spcode('ru', -14109)); 
  PIPE ROW(spcode('ruan', -14099)); 
  PIPE ROW(spcode('rui', -14097)); 
  PIPE ROW(spcode('run', -14094)); 
  PIPE ROW(spcode('ruo', -14092)); 
  PIPE ROW(spcode('sa', -14090)); 
  PIPE ROW(spcode('sai', -14087)); 
  PIPE ROW(spcode('san', -14083)); 
  PIPE ROW(spcode('sang', -13917)); 
  PIPE ROW(spcode('sao', -13914)); 
  PIPE ROW(spcode('se', -13910)); 
  PIPE ROW(spcode('sen', -13907)); 
  PIPE ROW(spcode('seng', -13906)); 
  PIPE ROW(spcode('sha', -13905)); 
  PIPE ROW(spcode('shai', -13896)); 
  PIPE ROW(spcode('shan', -13894)); 
  PIPE ROW(spcode('shang', -13878)); 
  PIPE ROW(spcode('shao', -13870)); 
  PIPE ROW(spcode('she', -13859)); 
  PIPE ROW(spcode('shen', -13847)); 
  PIPE ROW(spcode('sheng', -13831)); 
  PIPE ROW(spcode('shi', -13658)); 
  PIPE ROW(spcode('shou', -13611)); 
  PIPE ROW(spcode('shu', -13601)); 
  PIPE ROW(spcode('shua', -13406)); 
  PIPE ROW(spcode('shuai', -13404)); 
  PIPE ROW(spcode('shuan', -13400)); 
  PIPE ROW(spcode('shuang', -13398)); 
  PIPE ROW(spcode('shui', -13395)); 
  PIPE ROW(spcode('shun', -13391)); 
  PIPE ROW(spcode('shuo', -13387)); 
  PIPE ROW(spcode('si', -13383)); 
  PIPE ROW(spcode('song', -13367)); 
  PIPE ROW(spcode('sou', -13359)); 
  PIPE ROW(spcode('su', -13356)); 
  PIPE ROW(spcode('suan', -13343)); 
  PIPE ROW(spcode('sui', -13340)); 
  PIPE ROW(spcode('sun', -13329)); 
  PIPE ROW(spcode('suo', -13326)); 
  PIPE ROW(spcode('ta', -13318)); 
  PIPE ROW(spcode('tai', -13147)); 
  PIPE ROW(spcode('tan', -13138)); 
  PIPE ROW(spcode('tang', -13120)); 
  PIPE ROW(spcode('tao', -13107)); 
  PIPE ROW(spcode('te', -13096)); 
  PIPE ROW(spcode('teng', -13095)); 
  PIPE ROW(spcode('ti', -13091)); 
  PIPE ROW(spcode('tian', -13076)); 
  PIPE ROW(spcode('tiao', -13068)); 
  PIPE ROW(spcode('tie', -13063)); 
  PIPE ROW(spcode('ting', -13060)); 
  PIPE ROW(spcode('tong', -12888)); 
  PIPE ROW(spcode('tou', -12875)); 
  PIPE ROW(spcode('tu', -12871)); 
  PIPE ROW(spcode('tuan', -12860)); 
  PIPE ROW(spcode('tui', -12858)); 
  PIPE ROW(spcode('tun', -12852)); 
  PIPE ROW(spcode('tuo', -12849)); 
  PIPE ROW(spcode('wa', -12838)); 
  PIPE ROW(spcode('wai', -12831)); 
  PIPE ROW(spcode('wan', -12829)); 
  PIPE ROW(spcode('wang', -12812)); 
  PIPE ROW(spcode('wei', -12802)); 
  PIPE ROW(spcode('wen', -12607)); 
  PIPE ROW(spcode('weng', -12597)); 
  PIPE ROW(spcode('wo', -12594)); 
  PIPE ROW(spcode('wu', -12585)); 
  PIPE ROW(spcode('xi', -12556)); 
  PIPE ROW(spcode('xia', -12359)); 
  PIPE ROW(spcode('xian', -12346)); 
  PIPE ROW(spcode('xiang', -12320)); 
  PIPE ROW(spcode('xiao', -12300)); 
  PIPE ROW(spcode('xie', -12120)); 
  PIPE ROW(spcode('xin', -12099)); 
  PIPE ROW(spcode('xing', -12089)); 
  PIPE ROW(spcode('xiong', -12074)); 
  PIPE ROW(spcode('xiu', -12067)); 
  PIPE ROW(spcode('xu', -12058)); 
  PIPE ROW(spcode('xuan', -12039)); 
  PIPE ROW(spcode('xue', -11867)); 
  PIPE ROW(spcode('xun', -11861)); 
  PIPE ROW(spcode('ya', -11847)); 
  PIPE ROW(spcode('yan', -11831)); 
  PIPE ROW(spcode('yang', -11798)); 
  PIPE ROW(spcode('yao', -11781)); 
  PIPE ROW(spcode('ye', -11604)); 
  PIPE ROW(spcode('yi', -11589)); 
  PIPE ROW(spcode('yin', -11536)); 
  PIPE ROW(spcode('ying', -11358)); 
  PIPE ROW(spcode('yo', -11340)); 
  PIPE ROW(spcode('yong', -11339)); 
  PIPE ROW(spcode('you', -11324)); 
  PIPE ROW(spcode('yu', -11303)); 
  PIPE ROW(spcode('yuan', -11097)); 
  PIPE ROW(spcode('yue', -11077)); 
  PIPE ROW(spcode('yun', -11067)); 
  PIPE ROW(spcode('za', -11055)); 
  PIPE ROW(spcode('zai', -11052)); 
  PIPE ROW(spcode('zan', -11045)); 
  PIPE ROW(spcode('zang', -11041)); 
  PIPE ROW(spcode('zao', -11038)); 
  PIPE ROW(spcode('ze', -11024)); 
  PIPE ROW(spcode('zei', -11020)); 
  PIPE ROW(spcode('zen', -11019)); 
  PIPE ROW(spcode('zeng', -11018)); 
  PIPE ROW(spcode('zha', -11014)); 
  PIPE ROW(spcode('zhai', -10838)); 
  PIPE ROW(spcode('zhan', -10832)); 
  PIPE ROW(spcode('zhang', -10815)); 
  PIPE ROW(spcode('zhao', -10800)); 
  PIPE ROW(spcode('zhe', -10790)); 
  PIPE ROW(spcode('zhen', -10780)); 
  PIPE ROW(spcode('zheng', -10764)); 
  PIPE ROW(spcode('zhi', -10587)); 
  PIPE ROW(spcode('zhong', -10544)); 
  PIPE ROW(spcode('zhou', -10533)); 
  PIPE ROW(spcode('zhu', -10519)); 
  PIPE ROW(spcode('zhua', -10331)); 
  PIPE ROW(spcode('zhuai', -10329)); 
  PIPE ROW(spcode('zhuan', -10328)); 
  PIPE ROW(spcode('zhuang', -10322)); 
  PIPE ROW(spcode('zhui', -10315)); 
  PIPE ROW(spcode('zhun', -10309)); 
  PIPE ROW(spcode('zhuo', -10307)); 
  PIPE ROW(spcode('zi', -10296)); 
  PIPE ROW(spcode('zong', -10281)); 
  PIPE ROW(spcode('zou', -10274)); 
  PIPE ROW(spcode('zu', -10270)); 
  PIPE ROW(spcode('zuan', -10262)); 
  PIPE ROW(spcode('zui', -10260)); 
  PIPE ROW(spcode('zun', -10256)); 
  PIPE ROW(spcode('zuo', -10254)); 
  RETURN;
END;

 

 

4.创建汉字转拼音的函数

 

 

CREATE OR REPLACE FUNCTION getSpell
(
  cnString IN VARCHAR2
)
RETURN VARCHAR2
IS
  lv_spell VARCHAR2(500);
  lv_temp VARCHAR2(30);
  lv_char VARCHAR2(30);
  lv_bytes VARCHAR2(200);
  li_bytes INTEGER;
  li_pos INTEGER;
BEGIN
  --遍历传入的中文的每个字符,做相应处理
  FOR i IN 1..LENGTH(cnString) LOOP
    --先截取出对应的字符
    lv_char := SUBSTR(cnString,i,1);
    IF LENGTHB(lv_char) = 1 THEN
      --如果字节长度是1,则认为是ASCII码
      lv_spell:=lv_spell||lv_char;
    ELSIF LENGTHB(lv_char) = 2 THEN
      --如果字节长度是2,则认为是ZHS16GBK编码(即编码格式为GBK)
      --获取汉字标码
      SELECT REPLACE(
          SUBSTRB(
            DUMP(lv_char,1010),
            INSTRB(DUMP(lv_char,1010),'ZHS16GBK:')
           ),
           'ZHS16GBK: '
           ,''
       ) INTO lv_bytes FROM DUAL;
       li_pos:=INSTR(lv_bytes,',');
       li_bytes:=SUBSTR(lv_bytes,1,li_pos-1)*256+SUBSTR(lv_bytes,li_pos+1)-256*256;
      --查看此汉字的表码是否在区间范围之内
      IF (li_bytes < -20319 OR li_bytes > -10254) THEN
        --如果不在区间之内,则认为是不确定的字符集
        lv_spell:=lv_spell||'?';
      ELSE
        --从管道表中查找对应的汉字
        SELECT MAX("name") INTO lv_temp FROM TABLE(getTblSpcode) WHERE "code" <= li_bytes;
        lv_spell:=lv_spell||lv_temp;
      END IF;
    ELSIF LENGTHB(lv_char) = 3 THEN
      --如果字节长度是3,则认为是UTF8编码
      --先将UTF8字符集的字符串转换为ZHS16GBK,并取出存储结构
      SELECT REPLACE(
          SUBSTRB(
            DUMP(CONVERT(lv_char,'ZHS16GBK','UTF8') ,1010),
            INSTRB(DUMP( CONVERT(lv_char,'ZHS16GBK','UTF8'),1010),'UTF8:')
           ),
           'UTF8: '
           ,''
       ) INTO lv_bytes FROM DUAL;
       li_pos:=INSTR(lv_bytes,',');
       li_bytes:=SUBSTR(lv_bytes,1,li_pos-1)*256+SUBSTR(lv_bytes,li_pos+1)-256*256;
        --查看此汉字的表码是否在区间范围之内
       IF (li_bytes < -20319 OR li_bytes > -10254) THEN
         --如果不在区间之内,则认为是不确定的字符集
         lv_spell:=lv_spell||'?';
       ELSE
         --从管道表中查找对应的汉字
         SELECT MAX("name") INTO lv_temp FROM TABLE(getTblSpcode) WHERE "code" <= li_bytes;
         lv_spell:=lv_spell||lv_temp;
       END IF;
   END IF;
  END LOOP;
  RETURN lv_spell;
END;

 

5.测试一下

 

 

SELECT getSpell('汉字转拼音') FROM DUAL 
 

 

 

 

分享到:
评论

相关推荐

    Oracle 拼音检索函数 已对性能和频度优化 调用速度快

    获取汉字首字母拼音 Oracle 拼音检索函数 已对性能和频度优化 调用速度快。select f_pinyin('中国') from dual; select * from table where f_pinyin(field) like '%%';

    oracle拼音首字母查询

    Oracle拼音首字母查询是一种在Oracle数据库中实现对汉字进行拼音首字母检索的技术。在中文环境中,为了方便用户根据汉字的拼音首字母进行快速查找,这种查询方式尤其有用。Oracle数据库虽然原生支持英文字符集,但...

    Oracle 汉字拼音简码获取

    ### Oracle 汉字拼音简码获取:深入解析与应用 在现代信息技术中,文本处理尤其是多语言文本处理,已经成为数据库管理和应用开发中的关键环节。其中,将汉字转换为其拼音简码(即取每个汉字拼音的首字母)是常见的...

    oracle生成拼音、五笔首字母的functions方法

    在Oracle数据库环境中,有时我们需要对汉字进行处理,例如生成拼音或五笔的首字母,这在数据检索、信息编码或构建搜索引擎时非常有用。本文将详细介绍如何在Oracle中实现这一功能,主要基于提供的两个SQL脚本文件:`...

    Oracle查询取汉字拼音首字母

    Oracle查询取汉字拼音首字母Function

    oracle获取汉字拼音首字母

    ### Oracle 获取汉字拼音首字母 在Oracle数据库中实现获取汉字拼音首字母的需求,通常涉及到对中文字符的处理以及拼音转换的技术。这样的功能可以应用于多种场景,例如数据排序、索引建立或是快速检索等。本文将...

    oracle汉字转拼音package包-支持UTF8

    2. `GET_INITIALS`:除了全拼音,还可能提供获取首字母的功能,即每个汉字的声母,这对于创建基于拼音的快速检索索引特别有用。 在使用这个Package之前,需要先将其导入到Oracle数据库中。压缩包中的"oracle汉字转...

    oracle 获取拼音码函数

    在Oracle数据库中,获取汉字的拼音码是一项常见的需求,特别是在处理中文数据时,例如进行全文检索、数据分析或者构建用户友好的搜索功能。标题提到的"oracle 获取拼音码函数"主要涉及的是如何在Oracle环境中实现对...

    oracle提取汉字拼音和首字母

    在Oracle数据库环境中,有时我们需要对汉字进行处理,例如获取汉字的拼音或首字母,这在中文数据检索、排序或建立索引时非常有用。本文将详细介绍如何使用PL/SQL存储过程来实现这一功能。 首先,我们需要理解Oracle...

    ORACLE-pinyin.rar_oracle_拼音

    在Oracle数据库系统中,处理汉字拼音的需求时常出现,特别是在进行数据检索、中文排序或与中文字符串相关的业务逻辑中。"ORACLE-pinyin.rar_oracle_拼音"这个压缩包文件很可能包含了一个或多个实用的PL/SQL函数,...

    Oracle函数取得姓名对应的拼音 字典数据

    在Oracle数据库中,处理汉字与拼音的转换是一个常见的需求,特别是在进行数据分析、报表制作或文本检索时。"Oracle函数取得姓名对应的拼音"这个主题主要涉及如何利用Oracle的内置功能或自定义函数来实现这一目标。...

    ORACLE中取汉字拼音首字母的存储过程

    在Oracle数据库环境中,处理汉字并提取其拼音首字母是一个复杂但实用的功能,尤其在需要对中文数据进行排序、检索或格式化的情况下。本文将详细解析一个用于在Oracle中获取汉字拼音首字母的存储过程,该过程通过一...

    汉字转全拼或首字母Oracle存储过程

    在Oracle数据库环境中,有时我们需要对汉字进行处理,例如将其转换为全拼或首字母,以进行数据检索、索引优化等操作。在这种情况下,可以利用PL/SQL编写存储过程来实现这一功能。"汉字转全拼或首字母Oracle存储过程...

    Oracle汉字拼音首字母函数

    在数据库处理中文数据时,有时候我们需要根据汉字转换成对应的拼音首字母来进行检索或排序。Oracle提供了多种方式来处理字符串,但针对汉字转拼音首字母的功能并没有内置的支持。本文将详细介绍一个自定义的Oracle...

    oracle package汉字转拼音 简拼

    总的来说,Oracle数据库结合Java编程语言,可以方便地实现汉字到拼音的转换,从而满足各种业务需求,如数据分析、文本检索或自动生成英文标识等。在处理大量汉字数据时,这样的解决方案尤其有用。

    可以根据汉字生成相应的拼音,方便在用户检索

    可以根据汉字生成相应的拼音,方便在用户检索

    获取拼音首码和五笔首码

    在数据库中,通过拼音首码可以快速定位到包含特定拼音的汉字,提高数据检索速度。对于大型数据库,这种快速检索方法尤其重要,因为它可以减少查询时间,提升用户体验。 五笔首码则源于五笔字型输入法,这是一种根据...

    oracle 同音字查询

    Oracle的Context索引允许创建自定义词典,通过自定义词典,我们可以定义特定的拼音转换规则,或者创建同义词库,将同音字或近义字映射到同一个词。这需要编写PL/SQL代码来实现,较为复杂,但能提供更精确的查询效果...

    关于Oracle中转中文,获取首字母的问题

    在Oracle数据库中处理中文字符,特别是需要将汉字转换为拼音并获取首字母,是一个常见的需求。这在构建索引、搜索优化或者特定的数据处理场景中非常有用。本篇将详细探讨如何在Oracle环境下实现这个功能。 首先,...

    包含声调的全拼音码表

    2. **拼音检索**:通过该码表可以在数据库中实现拼音检索功能。比如,在搜索框输入“shang”,系统可以根据声母和韵母匹配到所有拼音为“shang”的汉字。 3. **语音合成**:码表还可以应用于语音合成领域,将文本...

Global site tag (gtag.js) - Google Analytics