sqlserver 创建函数,使用SQLServer创建语言辅助函数

使用SQLServer创建语言辅助函数 - 应用软件 - 电脑教程网

使用SQLServer创建语言辅助函数

日期:2006-03-25   荐:闂傚倸鍊搁崐鐑芥嚄閸洖纾块柣銏⑶圭粈鍫熺節闂堟稓澧涢柡鍡樼矒閺岀喖鎮滃鍡樼暥缂備胶濮锋繛鈧鐐寸墪鑿愭い鎺嗗亾濠碘€炽偢濮婂宕掗妶鍛画闂侀潧娲ょ€氭澘顕f禒瀣垫晝妞ゎ偒鍘介崟鍐⒒娴e懙瑙勵殽閸濄儳鐭撶憸鐗堝笒閽冪喐绻涢幋娆忕仼闁告濞婇弻鏇熺箾閸喖濮嶇紓浣靛姀婵倗鎹㈠┑鍫濇瀳婵☆垰鍢叉禍楣冩煣韫囷絽浜滈柡瀣█濮婃椽宕崟顓犲姽缂傚倸绉崇欢姘剁嵁閸愩劉鏋庨柟鎯х-閻撴垶绻濋姀锝呯厫閽冮亶鏌ㄥ☉妤勫厡缂佽鲸鎹囧畷鎺戔枎閹板灚鈻婄紓鍌欒閸嬫挸銆掑锝呬壕濡炪們鍨哄畝鎼併€佸鈧慨鈧柣妯活問閸炵敻姊绘担铏瑰笡閺嬵亝銇勯弴鍡楁搐绾偓闂佽鍎兼慨銈夋偂閻斿吋鐓欓梺顓ㄧ畱婢ф澘霉閻樺磭娲撮柡宀嬬秮閺佸倿鎳為妷銉ь暡闂備礁鐤囬~澶愬垂閸ф绠栨繛鍡樺灍閸嬫挸鈽夊▍顓т簽閸犲﹤顓兼径瀣ф嫼缂佺虎鍘奸幏瀣吹鐎n剛纾肩紓浣贯缚缁犳捇鏌i敐鍥у幋闁诡喚鍏橀獮宥夋惞椤愩倐鍋撴繝姘拺閻熸瑥瀚崝銈夋煟鎺抽崝宀勫煝瀹ュ鍐€妞ゆ挾鍠撻崢浠嬫椤愩垺澶勬繛鍙夌墬缁傛帡鍩℃担鍙夋杸濡炪倖鏌ㄩ幖顐﹀焵椤掍胶娲村┑锛勬暬楠炲洭寮剁拠淇卞姂閺屽秹宕崟顐熷亾婵犳艾鍌ㄩ柛娑橈功缁♀偓闂侀潧楠忕徊鍓ф兜妤e啯鐓熸俊銈傚亾婵☆偅绻傞悾宄扳攽閸″繐鐗氶梺鍛婁緱閸ㄦ娊鏁嶅⿰鍕閺夊牆澧介崚浼存煙閼恒儳鐭掓鐐搭殜閹晠鎮介悽纰夌床闂佽鍑界紞鍡樼鐠轰綍鐔煎焵椤掑嫭鈷戠紒顖涙礃閺夊綊鏌涚€n偅灏い顏勫暣婵″爼宕卞Δ鈧ḿ鎴︽⒑缁嬫鍎愰柟鐟版搐铻炲ù锝囨嚀缁剁偤鏌熼柇锕€骞栭柍褜鍓涢弫濠氬蓟閵娿儮鏀介柛鈩兠▍锝咁渻閵堝繒鍒扮痪缁㈠弮閹偓妞ゅ繐鐗嗙粻濠氭煕濞戝崬鏋涙い蹇ユ嫹
  在现在这样一个全球化环境中,因为在不同的语言中有很多不同的语法规则,所以以前很多简单的任务现在都变得很困难。你可以将一门特定的语言分成一组语法规则和针对这些规则的异常(以及一个基本词语),从而将这些任务一般化。在一些编程语言(比如 Perl 和 Java)中,有一些公共域(domain)模块可以用来对文本完成语言转换。    下面给出一个稍微简单一点儿的例子,假设我们要将一个数字转换成其拼写版本(例如需要填写支票和法律合同)。这个诀窍在 Oracle 出现的早期已经有了,一般都以如下方式使用:    selectto_char(to_date(12345,'J'),'Jsp') from dual;    Twelve Thousand Three Hundred Forty-Five     TO_DATE 函数使用 Julian 日期格式将数字转换成一个日期。然后,TO_CHAR 接受一个日期参数并再次将其格式化为一个表示 Julian 日期的拼写数字版本的字符串。但是这个决窍有一些限制。    首先,在 Oracle 中 Julian 日期的最大有效值是9999年,所以日期的最大值只能取到5373484,而最小值是1或4712BC。而且,因为没有第“零”年,所以如果不额外使用一个 DECODE 或 CASE 语句就不可能生成文本“零”。第三个大的限制是它会忽略掉你的 NLS 设置。不管你使用的是哪种语言,数字总是以美国英语拼写出。一些简单的操作也存在这样的问题,比如拼写出天。例如,尝试生成西班牙语短语“Cinco de Mayo”:    alter session set nls_language = 'SPANISH';  select to_char(to_date('0505','MMDD'),'Ddspth Month') from dual;    Fifth Mayo     在为大多数语言生成数字时涉及的语法实际上相当简单。主体工作包括收集所有不同的语法规则并建立起足够的规则来生成正确的语法模式。(现在我将回避涉及到匹配数字和性别的问题。)    首先,我将创建两个表:第一个表保存基本的单词和异常,第二个表保存用于生成文本的一些简单的模板模式。如果在第一个表中有数字,那么我的语言函数就返回那个文本。对于其它每个数字,我将试图在一系列模式中匹配它,并应用一个模板来生成正确的文本。    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之间所有整数(包括零)的拼写版本已经足够了。    REM -- American English  insert into numwords values ('US',-1,'negative');  insert into numwords values ('US',0,'zero');  insert into numwords values ('US',1,'one');  insert into numwords values ('US',2,'two');  insert into numwords values ('US',3,'three');  insert into numwords values ('US',4,'four');  insert into numwords values ('US',5,'five');  insert into numwords values ('US',6,'six');  insert into numwords values ('US',7,'seven');  insert into numwords values ('US',8,'eight');  insert into numwords values ('US',9,'nine');  insert into numwords values ('US',10,'ten');  insert into numwords values ('US',11,'eleven');  insert into numwords values ('US',12,'twelve');  insert into numwords values ('US',13,'thirteen');  insert into numwords values ('US',15,'fifteen');  insert into numwords values ('US',18,'eighteen');  insert into numwords values ('US',20,'twenty');  insert into numwords values ('US',30,'thirty');  insert into numwords values ('US',40,'forty');  insert into numwords values ('US',50,'fifty');  insert into numwords values ('US',80,'eighty');  insert into numwords select 'GB',num,word from numwords where lang = 'US';    insert into numrules values ('US',0,1,1,'~2teen',null);  insert into numrules values ('US',1,1,1,'~1ty','~1-~2');  insert into numrules values ('US',2,1,2,'~1 hundred',null);  insert into numrules values ('US',3,3,3,'~1 thousand',null);  insert into numrules values ('US',4,3,6,'~1 million',null);  insert into numrules select 'GB',seq,p1,p2,temp0,temp    from numrules where lang = 'US';  insert into numrules values ('US',5,3,9,'~1 billion',null);  insert into numrules values ('GB',5,3,9,'~1 thousand million',null);  insert into numrules values ('US',6,3,12,'~1 trillion',null);  insert into numrules values ('GB',6,3,12,'~1 million million',null);    REM - German  insert into numwords values ('D',-1,'negativ');  insert into numwords values ('D',0,'null');  insert into numwords values ('D',1,'eins');  insert into numwords values ('D',2,'zwei');  insert into numwords values ('D',3,'drei');  insert into numwords values ('D',4,'vier');  insert into numwords values ('D',5,unistr('f
标签:

闂傚倸鍊搁崐鎼佸磹閻戣姤鍤勯柤鍝ユ暩娴犳氨绱撻崒娆掑厡缂侇噮鍨跺畷婵單旈崘銊ョ亰闂佸搫鍟悧濠囧磹婵犳碍鐓㈡俊顖欒濡叉悂鏌f惔顔煎籍婵﹨娅g划娆戞崉閵娧傜礃闂備胶枪椤戝洭宕戦妶鍛殾闁硅揪绠戞儫闂佸啿鎼崐濠氬储娴犲鈷戦柛婵嗗閺嗘瑩鏌涙繝鍛惞闁轰緡鍠栭埥澶娾枎閹寸媭鍟庨梻浣告啞娓氭宕板璺虹疇闁搞儺鍓氶悡娑㈡倶閻愭彃鈷旀い顒冨亹缁辨帡鎮╁畷鍥ㄥ垱闂佽桨鐒﹂崝娆忕暦閵娾晩鏁嗛柛灞剧矋閺呫劑姊婚崒姘偓鐑芥嚄閸洖纾块柛顭戝亝閸欏繒鈧箍鍎遍ˇ顖氼啅濠靛洢浜滈柡鍐ㄦ搐娴滃湱鎲搁悧鍫熷唉婵﹦绮幏鍛存偡闁箑娈濇繝纰樻閸嬪倻绮堟担鐣屼罕闂備礁鎲″ú锕傚垂娴g懓绶為柟閭﹀幗濞呫垽姊虹捄銊ユ珢闁瑰嚖鎷�

缂傚倸鍊搁崐鎼佸磹閹间礁纾归柣鎴eГ閸婂潡鏌ㄩ弴鐐测偓鍫曞焵椤掆偓閸熸潙鐣烽崡鐑嗘富闁靛骏绱曢埊鏇犵磼濡ゅ啫鏋涢柛鈹惧亾濡炪倖甯掔€氼喖鐣垫笟鈧獮鏍垝閻熸壆浼嬮梺鍝勫暙閻楀棗顔忓┑鍥ヤ簻闁规崘娉涢灞句繆閸欏灏︽慨濠勭帛閹峰懘鎼归獮搴撳亾婵犲洦鐓曢柟鎯ь嚟缁犳捇鏌e⿰鍐剧吋鐎规洜枪铻栭柍褜鍓熼幃鐐哄垂椤愮姳绨婚梺纭呮彧缁插墽娑甸崼鏇熺厽妞ゆ挾鍠撻幊鍕亜閵婏絽鍔﹂柟顔界懇閸┾剝鎷呭畡閭︽闂傚倷娴囧畷鐢稿窗閹邦喖鍨濈€光偓閸曨剛鍘愰梺鎸庣箓椤︻垳绮婚弽顐e枑闊洦娲栭崹婵囩箾閸℃绨挎繛鎴欏灪椤ュ牊绻涢幋鐐垫噯缁绢厸鍋撻梻鍌欑窔閳ь剛鍋涢懟顖涙櫠閸撗呯=鐎广儱鎳忛ˉ銏⑩偓瑙勬磸閸ㄤ粙鐛崱娑掆偓鏍敆婵犲嫮袦闂佽桨鐒﹂幑鍥极閹剧粯鏅搁柨鐕傛嫹

濠电姷鏁告慨鐑藉极閹间礁纾婚柣鎰惈閸ㄥ倿鏌涢锝嗙缂佺姳鍗抽弻鐔兼⒒鐎垫瓕绠為梺鎼炲労閸擄箓寮繝鍥ㄧ厱闁圭偓顨呴幊鎰板汲閵夛妇绡€缁剧増蓱椤﹪鏌涢妸褎鏆┑鈩冩尦閸┾偓妞ゆ帒瀚悡鐔兼煙闁箑骞楃紒鈧€n喗鐓涚€光偓鐎n剛鐦堥悗瑙勬礃閿曘垺淇婇幖浣肝ㄩ柕鍫濇处閺呭ジ姊婚崒娆愮グ妞ゆ泦鍕垫闁归棿鐒﹂崑銈夋煏婵炑冨鎼村﹤鈹戦悙鏉戠仧闁搞劌婀遍惀顏囶樄闁哄瞼鍠栭獮鏍敇閻愯尙顔愰梻浣告啞閹哥偓鏅跺Δ鍐╁床婵犻潧顑呴悡鏇㈡煃瑜滈崜鐔风暦閵娾晩鏁囧鑸电〒閹偐绱掓潏銊ョ闁逞屽墾缂嶅棙绂嶇捄浣曠喖鍩€椤掑嫭鍊垫繛鍫濈仢閺嬫瑧绱掗鐣屾噰鐎殿噮鍋婂畷鎺楁倷閼碱剦妲堕柣鐔哥矊缁绘ê鐣烽姀銈庢晜闁割偆鍟块幏缁樼箾鏉堝墽绉い顐㈩樀婵$敻鎮㈤崫銉х槇濡炪値鍋掗崢鍓х玻閺冣偓椤ㄣ儵鎮欓懠顒傤啋闂佽桨鐒﹂幑鍥极閹剧粯鏅搁柨鐕傛嫹

闂傚倸鍊搁崐鎼佸磹瀹勬噴褰掑炊椤掑鏅梺鍝勭▉閸樺ジ宕归崒姣綊宕楅崗鑲╃▏缂備胶濮锋慨鐑藉焵椤掆偓缁犲秹宕曢柆宓ュ洦瀵奸弶鎴濇優闂佸湱鍎ら〃鍡涙偂閺囥垺鐓冮柍杞扮閺嗙喖鏌嶉娑欑闁哄本绋撻埀顒婄秵娴滆泛螣閳ь剟鎮楀▓鍨灈闁绘牜鍘ч悾鐑芥偂鎼存ɑ顫嶅┑鈽嗗灟鐠€锕傛倵閹惰姤鈷掑ù锝呮啞閸熺偤鏌熼崫銉ュ幋鐎规洩绻濆畷妯侯啅椤旂晫绋佹繝鐢靛仜濡﹥绂嶅⿰鍛/鐟滄棃骞冭ぐ鎺戠畳闁圭儤鍨甸ˉ搴ㄦ⒑闂堟稓杩斿Λ棰佽兌閻╁酣姊绘担鍛婃儓婵炲眰鍨藉畷婵嗙暆閸曨偄鍤戝┑鐐村灟閸ㄦ椽藟閸℃鐔嗛柤鎼佹涧婵牓鏌涙繝鍕毈闁哄被鍔岄埞鎴﹀幢濞戞墎鍋撳Δ渚囨闁绘劗鎽查幋鐐碘攳濠电姴瀚€氭氨鎲告惔锝傚亾濮樼偓瀚�

闂傚倸鍊搁崐鎼佸磹妞嬪海鐭嗗〒姘e亾妤犵偛顦甸弫鎾绘偐閼碱剦妲烽梻浣告惈缁嬩線宕戦崟顖氬瀭婵犻潧顑嗛崐鍫曟煟閹邦喗鏆╅柟钘夊€块弻娑㈡偄闁垮娅х紓浣介哺閹稿骞忛崨瀛樺剬闂傗偓閹邦喛绻戝┑鐘垫暩閸嬬偤骞愰幖浣瑰亯濠靛倻枪閽冪喐绻涢幋娆忕仼闁告濞婇弻鏇熺箾閸喖濮㈡繛瀵稿閸曨厾鐦堥梺闈涢獜缂嶅棗岣块幇顓犵闁肩⒈鍓欓弸娑氣偓娈垮枦椤曆囧煡婢跺⿴娼ㄩ柛鈩兠崗濠冧繆閻愵亜鈧牜鏁幒妞濆洭鎮ч崼鐔哥彙濠电姷鏁告慨鐑姐€傞挊澹╋綁宕ㄩ弶鎴狅紱闂侀€炲苯澧撮柡宀嬬節瀹曘劑顢涘В瑁ゅ灪閵囧嫰寮撮鍡櫳戠紓浣虹帛缁诲倿锝炲┑瀣垫晞闁崇懓鐏濇俊浠嬫煏閸パ冾伃妞ゃ垺锕㈤幃銏☆槹鎼存繃妯婂┑鐘垫暩閸嬫盯鎮ч悙鍝勭闁跨噦鎷�