Sql server如何创建语言辅助函数
2007-05-18 09:38:05 来源:WEB开发网核心提示: 首先,我将创建两个表:第一个表保存基本的单词和异常,Sql server如何创建语言辅助函数(2),第二个表保存用于生成文本的一些简单的模板模式,如果在第一个表中有数字,我还将数据从美国英语拷贝到英国英语中并使用术语“thousand million”和&ldquo
首先,我将创建两个表:第一个表保存基本的单词和异常,第二个表保存用于生成文本的一些简单的模板模式。如果在第一个表中有数字,那么我的语言函数就返回那个文本。对于其它每个数字,我将试图在一系列模式中匹配它,并应用一个模板来生成正确的文本。
create table numwords
(
lang varchar2(2),
num integer,
word varchar2(30),
constraint numwords_pk primary key (lang,num)
);
create table numrules
(
lang varchar2(2),
seq integer,
p1 integer,
p2 integer,
temp0 varchar2(30),
temp varchar2(30),
constraint numrules_pk primary key (lang,seq)
);
下面是生成一个数字拼写版本所需的代码。这里我将按照基数来(比如1、2和3);而事实上,这些函数可以通过为每种语言列出更多异常和模式来生成序数(第1、第2、第三)和复数版本。
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;
最后,这里是我为英语和德语收集的一些数据。我还将数据从美国英语拷贝到英国英语中并使用术语“thousand million”和“million million”代替“billion”和“trillion”(美国用法),在美国之外这两个短语通常是混淆的来源。这些数据对生成-999,999,999,999到999,999,999,999之间所有整数(包括零)的拼写版本已经足够了。
赞助商链接