`
linjiacheng
  • 浏览: 70547 次
  • 性别: Icon_minigender_1
  • 来自: 中國
社区版块
存档分类
最新评论

Oracle中SQL查询语句日文不区分全角/半角

阅读更多

dfd

1.ORACLE自带的函数可以转换标点符号;   
  2.fn_knachg函数为转换全半角函数   
          参数:pKna为要转换的字符串;   
                      pPara:1为半角   →   全角;   
                                    2为全角   →   半角。   
    
  string   findSQL   =   "";   
  string   query   =   "abc";   
  findSQL   =   "SELECT   count(*)   cout   from   test1   where   fn_knachg(TO_MULTI_BYTE(test),1)   like   '%'||fn_knachg(TO_MULTI_BYTE('"   +   query   +   "'),1)||'%'";   
    
  CREATE   OR   REPLACE   FUNCTION   fn_knachg(pKna   IN   VARCHAR2,   pPara   IN   VARCHAR2)   RETURN   VARCHAR2   IS   
  TYPE     t_Zen1   IS   varray(95)   of   VARCHAR2(2);       
  tZen1     t_Zen1   :=   t_Zen1('ア',   'イ',   'ウ',   'エ',   'オ',   'カ',   'キ',   'ク',   'ケ',   'コ',   'サ',   'シ',   'ス',   'セ',   'ソ',   
                    'タ',   'チ',   'ツ',   'テ',   'ト',   'ナ',   'ニ',   'ヌ',   'ネ',   'ノ',   'ハ',   'ヒ',   'フ',   'ヘ',   'ホ',   
                    'マ',   'ミ',   'ム',   'メ',   'モ',   'ヤ',   'ユ',   'ヨ',   'ラ',   'リ',   'ル',   'レ',   'ロ',   'ワ',   'ヲ',   
                    'ン',   'ァ',   'ィ',   'ゥ',   'ェ',   'ォ',   'ッ',   'ャ',   'ュ',   'ョ',   'ー',   '、',   '。',   '・',   '」',   
                    '「',   '゛',   ' ',   ',',   '<',   '.',   '>',   '/',   '?',   '_',   '}',   ']',   '*',   ':',   '+',   
                    ';',   '{',   '[',   ' ̄',   '@',   '|',   '¥',   '`',   '^',   '=',   '-',   ')',   '(',   '&',   '%',   
                    '$',   '#',   '”',   '!',   '’');   
  TYPE     t_Han1   IS   varray(95)   of   VARCHAR2(2);   
  tHan1     t_Han1   :=   t_Han1('ア',   'イ',   'ウ',   'エ',   'オ',   'カ',   'キ',   'ク',   'ケ',   'コ',   'サ',   'シ',   'ス',   'セ',   'ソ',   
                    'タ',   'チ',   'ツ',   'テ',   'ト',   'ナ',   'ニ',   'ヌ',   'ネ',   'ノ',   'ハ',   'ヒ',   'フ',   'ヘ',   'ホ',   
                    'マ',   'ミ',   'ム',   'メ',   'モ',   'ヤ',   'ユ',   'ヨ',   'ラ',   'リ',   'ル',   'レ',   'ロ',   'ワ',   'ヲ',   
                    'ン',   'ァ',   'ィ',   'ゥ',   'ェ',   'ォ',   'ッ',   'ャ',   'ュ',   'ョ',   'ー',   '、',   '。',   '・',   '」',   
                    '「',   '゙',   '   ',   ',',   '<',   '.',   '>',   '/',   '?',   '_',   '}',   ']',   '*',   ':',   '+',   
                    ';',   '{',   '[',   '~',   '@',   '|',   '\',   '`',   '^',   '=',   '-',   ')',   '(',   '&',   '%',   
                    '$',   '#',   '"',   '!',   '''');   
      
  TYPE     t_Zen2   IS   varray(26)   of   VARCHAR2(2);       
  tZen2     t_Zen2   :=   t_Zen2('ガ',   'ギ',   'グ',   'ゲ',   'ゴ',   'ザ',   'ジ',   'ズ',   'ゼ',   'ゾ',   'ダ',   'ヂ',   'ヅ',   'デ',   'ド',   
                    'バ',   'ビ',   'ブ',   'ベ',   'ボ',   'パ',   'ピ',   'プ',   'ペ',   'ポ',   'ヴ');   
  TYPE     t_Han2   IS   varray(26)   of   VARCHAR2(4);   
  tHan2     t_Han2   :=   t_Han2('ガ',   'ギ',   'グ',   'ゲ',   'ゴ',   'ザ',   'ジ',   'ズ',   'ゼ',   'ゾ',   'ダ',   'ヂ',   'ヅ',   'デ',   'ド',   
                    'バ',   'ビ',   'ブ',   'ベ',   'ボ',   'パ',   'ピ',   'プ',   'ペ',   'ポ',   'ヴ');   
      
  TYPE     t_Zen3   IS   varray(5)   of   VARCHAR2(2);         
  tZen3     t_Zen3   :=   t_Zen3('ヮ',   'ヰ',   'ヱ',   'ヵ',   'ヶ');   
  TYPE     t_Han3   IS   varray(5)   of   VARCHAR2(2);   
  tHan3     t_Han3   :=   t_Han3('ワ',   'イ',   'エ',   'カ',   'ケ');   
      
  sKna     varchar2(4000);   
  i       int;   
  BEGIN   
      
  sKna   :=   pKna;   
  if   pPara   =   '1'   then     --   半角   →   全角   
      for   i   in   1..26   loop   
        sKna   :=   replace(sKna,   tHan2(i),   tZen2(i));   
      end   loop;   
      
      for   i   in   1..95   loop   
        sKna   :=   replace(sKna,   tHan1(i),   tZen1(i));   
      end   loop;   
      sKna   :=   to_multi_byte(sKna);   
  elsif   pPara   =   '2'   then   --   全角   →   半角   
      for   i   in   1..26   loop   
        sKna   :=   replace(sKna,   tZen2(i),   tHan2(i));   
      end   loop;   
      
      for   i   in   1..95   loop   
        sKna   :=   replace(sKna,   tZen1(i),   tHan1(i));   
      end   loop;   
      
      for   i   in   1..5   loop   
        sKna   :=   replace(sKna,   tZen3(i),   tHan3(i));   
      end   loop;   
      sKna   :=   to_single_byte(sKna);   
  end   if;   
  return   sKna;   
      
  END;   

 

 

分享到:
评论
1 楼 zuwenjiang 2008-09-16  
版主你好,我在项目中也遇到如此情况,我们在java中的SQL中使用了一些全角空格,在我们的系统下没有问题,运行一切正常,但在客户那边执行后,直接报系统错误
ora- 03001 的错误,然后客户把全角空格去掉之后,执行又一切正常了,表面看起来是我们的问题,但总感觉有些蹊跷,有以下几个疑点 :
1,首先,我们是改造客户的系统,而未改造的SQL中,大量存在全角空格,都不出错。
2,其次,在SQL PLUS之类的工具进行测试,全角空格也不出错,查询都能正常实现

不知道版主是否了解ora 09001的错误是什么引起的,而我们和客户的环境基本一致
win2003日文,oralce 9.2.0.8.0 ,apache2.09, tomcat 5.0.28
jdk1.4.2.13,JDBC是客户提供的,应该完全一致,还有什么能引起不一致呢?

不知道版主对以上情况有什么想法没有?请赐教。
如果可以,请发邮件联系我,谢谢 zuwenjiang@gmail.com

相关推荐

Global site tag (gtag.js) - Google Analytics