科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道[Sql server]如何创建语言辅助函数(3)

[Sql server]如何创建语言辅助函数(3)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在现在这样一个全球化环境中,因为在不同的语言中有很多不同的语法规则,所以以前很多简单的任务现在都变得很困难。

作者:korn 来源:赛地论坛 2007年9月15日

关键字: 语言辅助函数 数据库 SQL Server SQL Server 各版本

  • 评论
  • 分享微博
  • 分享邮件
 

最后,这里是我为英语和德语收集的一些数据。我还将数据从美国英语拷贝到英国英语中并使用术语“thousand million”和“million million”代替“billion”和“trillion”(美国用法),在美国之外这两个短语通常是混淆的来源。这些数据对生成-999,999,999,999到999,999,999,999之间所有整数(包括零)的拼写版本已经足够了。

REM -- create a table of base words and exceptions
  create or replace package genword
  
as
    
function get_word(n number) return varchar2;
    
function cardinal(n number) return varchar2;
  
end genword;
  
/
  show errors;
  
  
create or replace package body genword
  
as
    
function get_word(n number) return varchar2
    
is
      l_wordnumwords.word
%type;
    
begin
      
select word into l_word from numwords
      
where lang = sys_context('userenv','lang') and num = n;
      
return l_word;
    exception
      
when no_data_found then
        
return null;
    
end;
    
--
    function cardinal(n number) return varchar2
    
is
      p
number;    -- power
      t varchar2(30); -- template
      v number;    -- lower portion
      l_word   numwords.word%type;
    
begin
      
if n < 0 then
        l_word :
= get_word(-1);
        
if l_word is null then
          
return null;
        
end if;
        
return l_word||' '||cardinal(-n);
      
end if;
      l_word :
= get_word(n);
      
if l_word is not null then
        
return l_word;
      
end if;
      
for row in
      (
        
select * from numrules
        
where lang = sys_context('userenv','lang')
        
order by seq
      )
      loop
        
if length(n) <= row.p1 + row.p2 then
          p :
= power(10,row.p2);
          v :
= mod(n,p);
          
if row.seq = 0 then
            
if n < 20 then
              
return replace(row.temp0,'~2',cardinal(v));
            
end if;
          
else
            
if v = 0 then
              
return replace(row.temp0,'~1',cardinal(n/p));
            
else
              
return replace(replace(nvl(row.temp,'~1 ~2'),
                
'~1',cardinal(n-v)),
                
'~2',cardinal(v));
            
end if;
          
end if;
        
end if;
      
end loop;
      
return 'NUMBER TOO LARGE';
    
end cardinal;
  
end genword;
  
/
  show errors;
  下面是一些简单的 SQL 语句,这些语句使用了前面提供到函数和数据。你可以试一下将语言设成‘GERMAN’,或‘ENGLISH’来测试其它两组数据:
SQL> alter session set nls_language = 'AMERICAN';
  SQL> select genword.cardinal(123456789) from dual;
  
  one hundred twenty-three million four hundred fifty-six thousand seven hundred
  eighty-nine
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章